预定义类型 'System.Runtime.CompilerServices.IsExternalInit' 未定义或未导入

Predefined type 'System.Runtime.CompilerServices.IsExternalInit' is not defined or imported

我在使用 Visual Studio 2019 预览版测试 C# 9.0 的新功能时遇到了这个问题。我正在测试 init setter,但编译器显示错误消息:

错误 CS0518 未定义或导入预定义类型 'System.Runtime.CompilerServices.IsExternalInit'。下面是我试过的代码片段:

public class Book
{
     string ISBN { get; init; }
}

这是 Visual Studio 2019 中的一个小错误,尚未修复。要解决此问题,您需要在项目的任何位置添加一个名为 IsExternalInit 且命名空间 System.Runtime.CompilerServices 的虚拟 class。这样就可以了。

如果编写一个库,最好将此 class 设为内部,否则您最终可能会得到两个定义相同类型的库。

    namespace System.Runtime.CompilerServices
    {
          internal static class IsExternalInit {}
    }

编辑(2020 年 11 月 16 日):

根据我从 C# 语言团队的首席开发主管 Jared Parsons 那里得到的答复,上述问题不是错误。编译器会抛出此错误,因为我们正在针对较旧的 .NET Framework 版本编译 .NET 5 代码。请参阅下面的消息:

Thanks for taking the time to file this feedback issue. Unfortunately this is not a bug. The IsExternalInit type is only included in the net5.0 (and future) target frameworks. When compiling against older target frameworks you will need to manually define this type.

Link 到 Visual Studio 开发者社区的报告:https://developercommunity.visualstudio.com/content/problem/1244809/error-cs0518-predefined-type-systemruntimecompiler.html

如果您想继续使用 .NET Core App 3.1,您将需要添加像 in this bug report 中解释的 Kinin Roza 类型。

但是,如果您将 csproj 更改为 <TargetFramework> 设置为 net5.0,它将解决您的问题,因为此类型仅在 5.0 中定义。

这是我的示例控制台应用 csproj 文件。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

</Project>