使用VS2019预览版测试C#9.0 init setter时遇CS0518错误咨询
解决Error CS0518: Predefined type 'System.Runtime.CompilerServices.IsExternalInit' is not defined or imported
这个错误我测试C# 9.0的init setter特性时也踩过坑,本质是编译器找不到IsExternalInit这个特殊标记类——它是C# 9.0为init、record这类新特性引入的,部分旧版.NET框架或者SDK环境里默认没有内置它的定义。给你几个靠谱的解决方案:
方案1:切换到.NET 5+目标框架
如果你的项目允许升级目标框架,直接把项目目标框架改成.NET 5或更高版本就行。从.NET 5开始,SDK已经内置了IsExternalInit的定义,不需要额外操作。
操作步骤:
- 右键项目 → 属性 → 应用程序 → 目标框架,选择.NET 5.0及以上版本。
方案2:手动添加IsExternalInit类(适配旧框架)
如果必须保留.NET Framework、.NET Core 3.x这类旧目标框架,你可以在项目里手动创建一个空的IsExternalInit类,完全能满足编译器的要求:
新建一个名为IsExternalInit.cs的文件,写入以下代码:
namespace System.Runtime.CompilerServices { internal static class IsExternalInit { } }
额外检查:确认语言版本设置正确
别忘了确保项目的C#语言版本已经设置为C# 9.0或更高:
- 右键项目 → 属性 → 生成 → 高级 → 语言版本,选择“C# 9.0”或者“最新预览版”(如果你用的是VS预览版的话)。
现在再测试你的代码(我给ISBN加了public修饰符,否则默认private,外部无法用init初始化,不过这不是你报错的原因):
public class Book { public string ISBN { get; init; } }
应该就能正常编译啦!
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

