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

Kev*_*in 30 c#-9.0

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

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

public class Book
{
     string ISBN { get; init; }
}
Run Code Online (Sandbox Code Playgroud)

Kin*_*oza 53

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

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

    namespace System.Runtime.CompilerServices
    {
          internal static class IsExternalInit {}
    }
Run Code Online (Sandbox Code Playgroud)

编辑(2020 年 11 月 16 日):

根据我从 C# 语言团队的主要开发负责人 Jared Parsons 那里得到的答复,上述问题不是错误。编译器抛出此错误是因为我们正在针对较旧的 .NET Framework 版本编译 .NET 5 代码。请看下面他的留言:

感谢您抽出时间提交此反馈问题。不幸的是,这不是一个错误。该IsExternalInit类型仅包含在 net5.0(和未来的)目标框架中。在针对较旧的目标框架进行编译时,您需要手动定义此类型。

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

  • 我的项目仍然配置为 netstandard(即使我切换到版本 9)。这是一个愚蠢的错误,但这个答案确实有助于指出这一点。 (2认同)

Max*_*ler 8

如果您想继续使用 .NET Core App 3.1,则需要添加类似 Kinin Roza 在此错误报告中解释的类型。

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

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

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

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

</Project>

Run Code Online (Sandbox Code Playgroud)

  • 我在 .Net5.0 上遇到了这个问题事件,不知道为什么 (14认同)