【问题标题】:Testing C# 9.0 in VS2019 - CS0518 IsExternalInit is not defined or imported ... How do I define/import it?在 VS2019 中测试 C# 9.0 - CS0518 IsExternalInit 未定义或导入...如何定义/导入它?
【发布时间】:2020-10-20 05:02:52
【问题描述】:

编辑 [2020 年 11 月 29 日]:.NET 5.0 现已推出,但如果您的目标是 .NET Standard 2.1,则仍需要以下解决方案


C# 9.0 仍在开发中。有几个参考资料让我相信它现在应该是可测试的(无论如何,其中一些)。

  1. Awesome 先生本人的 Microsoft 博客,介绍了这些功能。 https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/
  2. github上的语言跟踪页面:https://github.com/dotnet/roslyn/blob/master/docs/Language%20Feature%20Status.md

我正在使用 VS 2019 16.7 预览版 3.1。我已为项目选择语言版本作为 Preview

我可以使用一些 C# 9 功能。点赞:Dictionary<string, object> Stuff = new()

但是使用新的init 功能会给我这个错误:Error CS0518 Predefined type 'System.Runtime.CompilerServices.IsExternalInit' is not defined or imported

我该如何解决这个问题?

导致错误的代码示例:

class Test
{
   public int Hello { get; init; }
}

record Test(int hello);

记录定义是简写的,并扩展为使用init 的内容,这也是它受到影响的原因。

我在上面链接到的语言跟踪页面显示该功能是Merged into 16.7p3,我正在使用它。

我是不是太兴奋了?我需要等待吗?或者现在有没有办法使用这些功能:D

编辑(在 cmets 中请求) - 为 .net 5.0 控制台应用添加 csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <LangVersion>preview</LangVersion>
  </PropertyGroup>
</Project>

编辑 #2:此处发布的解决方法 - https://github.com/dotnet/roslyn/issues/45510

【问题讨论】:

  • 你的目标是 .net core 5 吗?
  • 是的。 .net 5.0 控制台应用程序 (preview6) 和 .net 标准 2.1 类库中都会出现此问题。
  • .net 标准 2.1 不会有这个。请发布您的整个 csproj
  • 编辑帖子以包含 csproj
  • 有人知道IsExternalInit 是什么意思吗?只是好奇。

标签: c# c#-9.0


【解决方案1】:

这是当前预览版中的一个错误最新的 master 分支(6 月 27 日)。 sharplab.io 中的简单记录会产生相同的错误。

只需在项目中的某处添加缺少的类型

using System.ComponentModel;

namespace System.Runtime.CompilerServices
{
    [EditorBrowsable(EditorBrowsableState.Never)]
    internal class IsExternalInit{}
}

记录和init 可以正常工作。

似乎只有 LinqPad 6 可以正常工作,可能是因为它也包含该类型

【讨论】:

  • 奇怪 - 对我来说,预览 7 中的问题实际上更糟。以前,我只需要在我的一个类库中定义上面的代码,任何引用它的东西都可以工作。现在,我必须在每个使用 records/init 的项目中定义它
  • 我在 TargetFramework netstandard2.0 和 LangVersion 9.0 时遇到了这个错误。这个类使它工作。
  • 我有 5.0 发行版,但它仍然是一个问题 wtf
  • @PanagiotisKanavos:我的经历和你一样(在许多其他项目中只有一个 .NET 5.0 项目在记录声明中遇到了这个问题)。我发现它发生在引用了其他项目的项目中,其中 .NET Standard 2.0 与 C#9.0 功能(如“记录”之一)一起使用。如果我从引用中删除了这个项目,错误就会消失。一旦我重新添加对项目的引用,它就会重新出现。如果您已经在旧项目中添加了该类也没关系,您也必须在当前项目中添加它。
  • 非常重要:不要不要在这个声明周围加上#if。有关详细信息,请参阅twitter.com/aarnott/status/1362786409954766858。另外,将其设为内部
【解决方案2】:

借用 Panagiotis Kanavos,您实际上可以将 IsExternalInit 声明为记录本身(自我实现的预言):

using System.ComponentModel;

namespace System.Runtime.CompilerServices
{
    [EditorBrowsable(EditorBrowsableState.Never)]
    public record IsExternalInit;
}

【讨论】:

    【解决方案3】:

    如果您不喜欢在每个项目中都添加IsExternalInit 类,可以使用Directory.Build.props 自动将文件添加为不可见的编译项:

    <?xml version="1.0" encoding="utf-8"?>
    <Project>
        <ItemGroup>
            <Compile Include="$(MSBuildThisFileDirectory)IsExternalInit.cs" Visible="false" />
        </ItemGroup>
    </Project>
    

    在解决方案的根目录中添加/编辑此文件,并在此处添加 IsExternalInit.cs 文件。这样做会自动将该文件添加到您的所有项目中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      相关资源
      最近更新 更多