本文介绍了以下编译器错误和警告:
- CS0171:在控制权返回给调用方之前,字段“name”必须已被完全赋值。请考虑将语言版本更新为“version”,以自动为该字段提供默认值。
- CS0188: 在分配所有字段之前,不能使用“this”对象。请考虑更新到语言版本“version”以自动默认未分配的字段。
- CS0843: 在将控件返回到调用方之前,必须完全分配自动实现的属性“name”。请考虑将语言版本“version”更新为自动默认属性。
- CS1617: /langversion 的选项“option”无效。使用“/langversion:?”列出支持的值。
- CS1638: “identifier”是保留标识符,在使用 ISO 语言版本模式时不能使用
- CS1738: 命名参数规范必须在指定所有固定参数后显示。请使用语言版本 7.2 或更高版本来允许非尾随命名参数。
- CS8021: 找不到 RuntimeMetadataVersion 的值。找不到包含 System.Object 的程序集,也没有通过选项指定 RuntimeMetadataVersion 的值。
- CS8022: 功能在 C# 1 中不可用。请使用语言版本 2 或更高版本。
- CS8023: C# 2 中不提供功能。请使用语言版本 3 或更高版本。
- CS8024: C# 3 中不提供功能。请使用语言版本 4 或更高版本。
- CS8025: 功能在 C# 4 中不可用。请使用语言版本 5 或更高版本。
- CS8026: 功能在 C# 5 中不可用。请使用语言版本 6 或更高版本。
- CS8058: 功能“feature”是实验性的,不受支持;使用“/features:feature”启用。
- CS8059: 功能在 C# 6 中不可用。请使用语言版本 7 或更高版本。
- CS8107: 功能在 C# 7.0 中不可用。请使用 7.1 或更高版本的语言。
- CS8192: 提供的语言版本不受支持或无效:“value”。
- CS8302: 功能在 C# 7.1 中不可用。请使用 7.2 或更高版本的语言。
- CS8303: 指定的语言版本“value”不能有前导零
- CS8304: 编译器版本:“version”。语言版本:版本。
- CS8305: “type”仅用于评估目的,在将来的更新中可能会更改或删除。
- CS8306:元组元素名称“name”是推断得出的。请使用语言版本 7.1 或更高版本,以通过推断得出的名称访问元素。
- CS8314: 类型为“type”的表达式不能由 C# 版本中的类型“type”模式处理。请使用语言版本“version”或更高版本。
- CS8320: C# 7.2 中不提供功能。请使用 7.3 或更高版本的语言。
- CS8370: 功能在 C# 7.3 中不可用。请使用语言版本 8 或更高版本。
- CS8371: 语言版本 7.3 不支持自动属性上的字段目标属性。请使用 8.0 或更高版本的语言。
- CS8400: 功能在 C# 8 中不可用。请使用语言版本 9 或更高版本。
- CS8401: 若要对内插逐字字符串使用“@$”而不是“$@”,请使用语言版本 8.0 或更高版本。
- CS8511:类型为“type”的表达式无法由类型为“type”的模式处理。请使用语言版本“version”或更高版本,以便使用常量模式匹配开放类型。
- CS8627: 除非使用语言版本“version”或更高版本,否则已知可为 null 的类型参数必须是值类型或不可为 null 的引用类型。请考虑更改语言版本或添加“class”、“结构”或类型约束。
- CS8630: C# 版本的“option”值无效:“value”。请使用语言版本“version”或更高版本。
- CS8652: 此功能目前处于预览状态,不受支持。若要使用预览功能,请使用“预览”语言版本。
- CS8701: 目标运行时不支持默认接口实现。
- CS8702: “member”无法实现类型“type”中的接口成员“member”,因为目标运行时不支持默认接口实现。
- CS8703: 修饰符“modifier”对于 C# 版本中的此项无效。请使用 8.0 或更高版本的语言。
- CS8704: “type”不实现接口成员“member”。“type”不能在 C# 版本中隐式实现非公共成员。请使用语言版本“version”或更高版本。
- CS8706: 类型无法实现类型中的接口成员,因为 C# 7.3 中不提供功能。
- CS8707:目标运行时不支持接口成员使用“protected”、“protected internal”或“private protected”可访问性。
- CS8773: C# 9 中不提供功能。请使用语言版本 10 或更高版本。
- CS8830: 目标运行时不支持重写时的协变返回类型。返回类型必须为“type”,以匹配被重写的成员“member”。
- CS8831: 目标运行时不支持重写中的协变类型。类型必须为“type”,以匹配被重写的成员“member”。
- CS8888: “托管”调用约定不能与非托管调用约定说明符结合使用。
- CS8889: 目标运行时不支持可扩展或运行时环境默认调用约定。
- CS8890: 未定义类型“type”。
- CS8891: 类型“type”必须为公共类型才能用作调用约定。
- CS8904: 差异无效:除非使用语言版本 9.0 或更高版本,否则类型参数在“member”上必须固定有效。
- CS8912: C# 9.0 不支持从带有密封“Object.ToString”的记录继承。请使用语言版本 10.0 或更高版本。
- CS8919: 目标运行时不支持接口中的静态抽象成员。
- CS8929: “method”无法实现类型“type”中的接口成员“member”,因为目标运行时不支持接口中的静态抽象成员。
- CS8936: C# 10 中不提供功能。请使用语言版本 11 或更高版本。
- CS8957: 条件表达式在语言版本 8.0 中无效,因为“type”和“type”之间找不到通用类型。若要使用目标类型转换,请升级到语言版本 9.0 或更高版本。
- CS8967:C# 10.0 不支持非逐字插值字符串中的换行。请使用 11.0 或更高版本的语言版本。
- CS9014: 使用可能未分配的自动实现的属性“name”。请考虑将语言版本“version”更新为自动默认属性。
- CS9015:使用了可能尚未赋值的字段“name”。请考虑将语言版本更新为“version”,以自动为该字段提供默认值。
- CS9016: 使用可能未分配的自动实现的属性“name”。请考虑将语言版本“version”更新为自动默认属性。
- CS9017: 使用了可能尚未赋值的字段“name”。请考虑将语言版本更新到“version”,以使该字段自动采用默认值。
- CS9041: “type”需要编译器功能“feature”,此版本的 C# 编译器不支持此功能。
- CS9058: 功能在 C# 11 中不可用。请使用语言版本 12 或更高版本。
- CS9064: 目标运行时不支持 ref 字段。
- CS9103: “type”是在某个模块中定义的,该模块的 RefSafetyRulesAttribute 版本无法识别,应为“11”。
- CS9171: 目标运行时不支持内联数组类型。
- CS9194: 参数不能使用“ref”关键字传递。若要将“ref”参数传递给“in”参数,请升级到语言版本 12 或更高版本。
- CS9202: C# 12.0 中不提供功能。请使用语言版本 13 或更高版本。
- CS9204: “type”仅用于评估目的,在将来的更新中可能会更改或删除。取消此诊断以继续。
- CS9211: “实验”属性的 diagnosticId 参数必须是有效的标识符。
- CS9240: 目标运行时不支持类似 ref 的泛型。
- CS9260: 功能在 C# 13.0 中不可用。请使用语言版本 14 或更高版本。
- CS9268: “type”仅用于评估目的,在将来的更新中可能会更改或删除:“message”。取消此诊断以继续。
- CS9269: UnscopedRefAttribute 仅在 C# 11 或更高版本或面向 net7.0 或更高版本时有效。
- CS9271:类型“Microsoft”。CodeAnalysis.EmbeddedAttribute'必须是非泛型、内部、非文件、密封的、非静态的,具有无参数构造函数,继承自 System.Attribute,并且能够应用于任何类型的.
- CS9327: C# 14.0 中不提供功能。请使用语言版本“version”或更高版本。
- CS9328: 方法“method”使用当前运行时异步不支持的功能。使用“System.Runtime.CompilerServices.RuntimeAsyncMethodGenerationAttribute(false)”选择方法退出运行时异步。
- CS9346:更新需要生成显式接口实现,而如果不重启应用程序,运行时将不支持此操作。
- CS9352: 目标运行时不支持扩展布局类型。
所有这些错误和警告背后的原因是编译器或运行时不支持你正在使用的功能。 解决方法取决于问题是语言版本配置问题、语言版本不匹配、运行时限制还是实验性功能。
语言版本配置错误
- CS1617: /langversion 的选项“option”无效。使用“/langversion:?”列出支持的值。
- CS1638: “identifier”是保留标识符,在使用 ISO 语言版本模式时不能使用
- CS8192: 提供的语言版本不受支持或无效:“value”。
- CS8303: 指定的语言版本“value”不能有前导零
- CS8304: 编译器版本:“version”。语言版本:版本。
这些错误指示 <LangVersion> 项目文件中的设置或 -langversion 编译器选项无效或与已安装的编译器不兼容。
将 <LangVersion> 项目文件中的值更正为有效的语言版本字符串(CS1617、 CS8192、 CS8303)。 有效值包括 default、latest、preview、latestMajor,或特定版本号,例如 7.3、8.0、9.0、10、11、12、13 或 14。 不要在版本号中包含前导零。 有关支持值的完整列表,请参阅 C# 语言版本控制 。
小窍门
若要查看受支持的语言版本列表,请参阅本文中的表格,使用 -langversion:? 进行编译,或者在生成前于项目文件中临时设置 <LangVersion>?</LangVersion>。
将.NET SDK 更新为编译器支持指定的语言版本(CS8304)。 每个 C# 编译器版本都支持高达特定最大值的语言版本。 如果指定的语言版本高于编译器支持的语言版本,请升级 SDK。
删除双下划线标识符,或将语言版本从 ISO-1 或 ISO-2 更改为较新版本(CS1638)。 ISO 语言模式保留包含 __ (双下划线)的标识符,因为它们不符合 ISO C# 规范。
注释
当前 C# 编译器不再生成 CS1638。 使用 ISO-1 或 ISO-2 语言版本时,较旧的编译器会报此错误。
编译器从目标框架确定其默认语言版本:
| 目标 | 版本 | C# 语言版本的默认值 |
|---|---|---|
| .NET | 11.x | C# 15 |
| .NET | 10.x | C# 14 |
| .NET | 9.x | C# 13 |
| .NET | 8.x | C# 12 |
| .NET | 7.x | C# 11 |
| .NET | 6.x | C# 10 |
| .NET | 5.x | C# 9.0 |
| .NET 核心 | 3.x | C# 8.0 |
| .NET 核心 | 2.x | C# 7.3 |
| .NET Standard | 2.1 | C# 8.0 |
| .NET Standard | 2.0 | C# 7.3 |
| .NET Standard | 1.x | C# 7.3 |
| .NET Framework | 全部 | C# 7.3 |
如果从项目文件中删除 LangVersion 该元素,编译器将使用目标框架的默认值。 还可以指定特定版本以启用较新的功能:
| 值 | 含义 |
|---|---|
preview |
编译器接受最新预览版中的所有有效语言语法。 |
latest |
编译器接受最新发布的编译器版本(包括次要版本)中的语法。 |
latestMajor或 default |
编译器接受最新发布的编译器主要版本中的语法。 |
15.0 |
编译器仅接受 C# 15 或更低版本中包含的语法。 |
14.0 |
编译器仅接受 C# 14 或更低版本中包含的语法。 |
13.0 |
编译器只接受 C# 13 或更低版本中所含的语法。 |
12.0 |
编译器只接受 C# 12 或更低版本中所含的语法。 |
11.0 |
编译器只接受 C# 11 或更低版本中包含的语法。 |
10.0 |
编译器只接受 C# 10 或更低版本中所含的语法。 |
9.0 |
编译器只接受 C# 9 或更低版本中所含的语法。 |
8.0 |
编译器只接受 C# 8.0 或更低版本中所含的语法。 |
7.3 |
编译器只接受 C# 7.3 或更低版本中所含的语法。 |
7.2 |
编译器只接受 C# 7.2 或更低版本中所含的语法。 |
7.1 |
编译器只接受 C# 7.1 或更低版本中所含的语法。 |
7 |
编译器只接受 C# 7.0 或更低版本中所含的语法。 |
6 |
编译器只接受 C# 6.0 或更低版本中所含的语法。 |
5 |
编译器只接受 C# 5.0 或更低版本中所含的语法。 |
4 |
编译器只接受 C# 4.0 或更低版本中所含的语法。 |
3 |
编译器只接受 C# 3.0 或更低版本中所含的语法。 |
ISO-2或 2 |
编译器只接受 ISO/IEC 23270:2006 C# (2.0) 中所含的语法。 |
ISO-1或 1 |
编译器只接受 ISO/IEC 23270:2003 C# (1.0/1.2) 中所含的语法。 |
若要详细了解每个框架版本支持的语言版本,请参阅语言参考部分中的 配置语言版本。
语言版本中不可用的功能
- CS1738:在所有固定参数均已指定后,必须显示命名参数规范。
- CS8022、 CS8023、CS8024、CS8025、CS8026、CS8059、CS8107、CS8302、CS8320、CS8370、CS8400、CS8773、CS8936、CS9058、CS9260、CS9327: 功能在 C# X 中不可用。请使用语言版本 Y 或更高版本。
- CS8306:已推断出元组元素名称。请使用 7.1 或更高版本的语言版本,通过推断出的名称访问元素。
- CS8314: 类型为“type”的表达式不能由 C# 版本中的类型“type”模式处理。请使用语言版本“version”或更高版本。
- CS8371: 语言版本 7.3 不支持自动属性上的字段目标属性。
- CS8401: 若要对内插逐字字符串使用“@$”而不是“$@”,请使用语言版本 8.0 或更高版本。
- CS8511:类型为“type”的表达式无法与类型为“type”的模式匹配。若要将开放类型与常量模式匹配,请使用语言版本“version”或更高版本。
- CS8627: 除非使用语言版本“version”或更高版本,否则已知可为 null 的类型参数必须是值类型或不可为 null 的引用类型。请考虑更改语言版本或添加“class”、“结构”或类型约束。
- CS8630: C# 版本的“option”值无效:“value”。请使用语言版本“version”或更高版本。
- CS8703: 修饰符“modifier”对于 C# 版本中的此项无效。
- CS8704: “type”不实现接口成员“member”。“type”无法隐式实现非公共成员。
- CS8706: 类型无法实现接口成员,因为此功能在此版本中不可用。
- CS8904:变体无效:除非使用语言版本 9.0 或更高版本,否则类型参数必须在“member”上以不变方式有效。
- CS8912: C# 9.0 不支持从带有密封“Object.ToString”的记录继承。
- CS8957: 条件表达式在语言版本 8.0 中无效,因为类型之间找不到通用类型。
- CS8967:C# 10.0 不支持在非逐字形式的插值字符串中使用换行符。
- CS9194: 参数不能使用“ref”关键字传递。若要将“ref”参数传递给“in”参数,请升级到语言版本 12 或更高版本。
这些错误都表明你使用的是需要比项目当前目标更新的 C# 版本的语言功能。 若要解决这些错误,请使用以下选项之一:
升级目标框架,以便编译器自动选择所需的语言版本。 每个目标框架映射到默认 C# 版本。 例如,.NET 8 默认为 C# 12,.NET 9 默认为 C# 13,.NET 10 默认为 C# 14。 请参阅 语言版本配置错误 中的表,了解完整的对应关系。
将项目文件中的
<LangVersion>元素设置为所需的版本或更高版本。 例如,若要启用 C# 12 功能,请<LangVersion>12</LangVersion>添加到<PropertyGroup>项目文件中。
如果无法升级,请避免触发错误的功能。 该错误消息指出了该功能名称和所需版本。 以下列表为特定错误提供了补充说明:
- 对所有参数使用显式命名参数,或者升级到 C# 7.2 或更高版本以使用非尾随命名参数(CS1738)。
- 按声明的名称(而不是推断的名称)访问元组元素,或升级到 C# 7.1 或更高版本(CS8306)。
- 在 8.0 之前的 C# 版本中,对于内插逐字字符串,请使用
$@"..."而不是@$"..."(CS8401)。 - 将显式类型约束添加到可为 null 的类型参数,或升级到 C# 9 或更高版本,以放宽此要求(CS8627)。
- 升级到 C# 8.0 或更高版本,以启用可为 null 注解和可为 null 上下文(CS8630)。
- 在条件表达式中,当两个分支没有共同类型时,请添加显式强制转换;或者升级到 C# 9 或更高版本,以使用目标类型条件表达式(CS8957)。
- 将换行符移到内插字符串表达式之外,或升级到 C# 11 或更高版本(CS8967)。
- 在向
in参数传递参数时,请使用in关键字而不是ref,或者升级到 C# 12 或更高版本(CS9194)。 - 显式实现非公共接口成员,而不是隐式实现,或升级到 C# 9 或更高版本(CS8704)。
目标运行时不支持功能
- CS8021: 找不到 RuntimeMetadataVersion 的值。
- CS8701: 目标运行时不支持默认接口实现。
- CS8702: “member”无法实现类型中的接口成员,因为目标运行时不支持默认接口实现。
- CS8707:目标运行时不支持在接口成员上使用“protected”“protected internal”或“private protected”访问修饰符。
- CS8830: 目标运行时不支持重写中的协变返回类型。
- CS8831: 目标运行时不支持替代中的协变类型。
- CS8889: 目标运行时不支持可扩展或运行时环境默认调用约定。
- CS8919: 目标运行时不支持接口中的静态抽象成员。
- CS8929: “method”无法实现类型“type”中的接口成员“member”,因为目标运行时不支持接口中的静态抽象成员。
- CS9041: “type”需要编译器功能“feature”,此版本的 C# 编译器不支持此功能。
- CS9064:目标运行时不支持 ref 字段。
- CS9103:“type”是在一个具有无法识别的 RefSafetyRulesAttribute 版本的模块中定义的,应为“11”。
- CS9171:目标运行时不支持内联数组类型。
- CS9240:目标运行时不支持 by-ref-like 泛型。
- CS9328: 方法“method”使用当前运行时异步不支持的功能。使用“System.Runtime.CompilerServices.RuntimeAsyncMethodGenerationAttribute(false)”选择方法退出运行时异步。
- CS9346:更新需要生成显式接口实现,而运行时在不重启应用程序的情况下不支持此操作。
- CS9352: 目标运行时不支持扩展布局类型。
这些错误不同于语言版本错误,因为升级 <LangVersion> 单独不会解决这些错误。 目标运行时(由 <TargetFramework> 指定)还必须在 CLR/运行时级别也支持该功能。
将项目文件中的版本 <TargetFramework> 升级到支持所需功能的版本。 以下列表显示了哪些功能需要最小运行时:
- 默认接口实现,包括受保护的访问(CS8701、CS8702、CS8707):需要 .NET Core 3.0/ .NET 5+。
- 接口中的静态抽象成员(CS8919,CS8929):需要.NET 7+。
- 协变返回类型(CS8830,CS8831):需要 5+ .NET。
- ref 字段(CS9064):需要 .NET 7 或更高版本。
- 内联数组类型(CS9171):需要 .NET 8 或更高版本。
- 类似 ref 的泛型(CS9240):需要 .NET 9+。
- 扩展布局类型(CS9352):需要.NET 10+。
- 可扩展调用约定(CS8889):需要 5+ .NET。
- 运行时异步功能(CS9328):需要.NET 10+。
如果编译器本身不支持所需的编译器功能(CS9041),请更新.NET SDK。 此错误指示引用的库使用需要更新编译器版本的元数据功能。
确保存在对核心运行时库的有效引用(CS8021)。 在没有标准运行时引用的情况下生成时,通常会显示此警告。 指定选项 RuntimeMetadataVersion 或添加对包含 System.Object的程序集的引用。
使用兼容的编译器版本(RefSafetyRulesAttribute)重新编译依赖模块来解决版本不匹配问题。
如果在热重载期间遇到此错误(CS9346),请重启应用程序。 某些编辑并继续更改需要重启,因为运行时无法动态发出所需的显式接口实现。
函数指针和调用约定错误
- CS8888: “托管”调用约定不能与非托管调用约定说明符结合使用。
- CS8889: 目标运行时不支持可扩展或运行时环境默认调用约定。
- CS8890:类型“type”未定义。
- CS8891: 类型“type”必须为公共类型才能用作调用约定。
这些错误与 C# 9 中引入的 函数指针 声明及其调用约定说明符相关。
从调用约定说明符列表中删除managed,这些列表还包括非托管说明符(CS8888)。
managed调用约定是默认值,不能与unmanaged说明符(如Cdecl、Stdcall或ThiscallFastcall)组合使用。
将目标框架升级到 .NET 5 或更高版本,以使用可扩展或运行时默认调用约定(CS8889)。
UnmanagedCallersOnly 属性和可扩展调用约定类型需要运行时支持,这些支持在 .NET Core 3.1 或更早版本中不可用。
确保调用约定类型存在于引用的程序集中(CS8890)。 调用约定类型(例如 CallConvCdecl、CallConvStdcall、CallConvThiscall 和 CallConvFastcall)是在 System.Runtime.CompilerServices 中定义的。 如果未找到该类型,请添加对正确运行时库的引用。
创建自定义调用约定类型 public(CS8891)。 如果定义自定义调用约定类型,请将其声明为 public 在函数指针类型声明中使用它。
实验功能和预览功能
- CS8058: 功能“feature”是实验性的,不受支持;使用“/features:feature”启用。
- CS8305: “type”仅用于评估目的,在将来的更新中可能会更改或删除。
- CS8652: 此功能目前处于预览状态,不受支持。若要使用预览功能,请使用“预览”语言版本。
- CS9204: “type”仅用于评估目的,在将来的更新中可能会更改或删除。取消此诊断以继续。
- CS9211:“Experimental”属性的 diagnosticId 自变量必须是有效的标识符。
- CS9268: “type”仅用于评估目的,在将来的更新中可能会更改或删除:“message”。取消此诊断以继续。
这些诊断表明你使用的是标记为实验性的功能或类型,或者仅在预览语言版本中可用。
警告
试验性功能可能会更改。 API 可能会更改,或者将来的更新中可能会删除这些 API。 包括实验性功能是库作者获取有关未来开发的想法和概念反馈的一种方式。 使用标记为实验性的任何功能时,请格外小心。
在项目文件中设置 <LangVersion>preview</LangVersion> 以使用预览语言功能(CS8652)。 预览版功能尚未完成,将来的版本中可能会更改。
禁止显示特定的诊断 ID 以确认 API(CS8058、CS8305、CS9204、CS9268) 的实验性。 库作者用 System.Diagnostics.CodeAnalysis.ExperimentalAttribute 标记 API,以表明这些 API 后续可能会发生变更。 可以通过在项目文件中使用 #pragma warning disable 或添加诊断 ID <NoWarn> 来取消诊断。
确保参数diagnosticId[Experimental]为有效的 C# 标识符(CS9211)。 标识符必须遵循标准命名规则。 它不能包含空格、特殊字符或以数字开头。 你还可以通过使用 System.Diagnostics.CodeAnalysis.ExperimentalAttribute 来声明你自己的实验性功能。
结构初始化的破坏性变更
- CS0171、CS8881:在控制返回给调用方之前,字段“name”必须已被完全赋值。请考虑更新到语言版本“version”,以自动为该字段提供默认值。
- CS0188、 CS8885:在 分配所有字段之前,不能使用“this”对象。请考虑更新到语言版本“version”以自动默认未分配的字段。
- CS0843、 CS8880: 在控件返回到调用方之前,必须完全分配自动实现的属性“name”。请考虑将语言版本“version”更新为自动默认属性。
- CS9014:使用了可能尚未赋值的自动实现属性“name”。请考虑将语言版本更新为“version”,以使该属性自动获得默认值。
- CS9015:使用了可能尚未赋值的字段“name”。请考虑将语言版本更新为“version”,以便自动为该字段提供默认值。
- CS9016:使用了可能尚未赋值的自动实现属性“name”。请考虑将语言版本更新到“version”,以便为该属性自动提供默认值。
- CS9017:使用了可能尚未赋值的字段“name”。请考虑将语言版本更新为“version”,以便自动为该字段提供默认值。
这些错误和警告有助于确保 struct 类型在其字段被访问之前已正确初始化。 在早期版本的 C# 中,必须在任何构造函数中显式赋值结构中的所有字段。 无参数构造函数将所有字段初始化为其默认值。 在更高版本中,所有构造函数将初始化所有字段。 字段可以被显式设置、在字段初始化器中设置,或被设置为其默认值。
升级到 C# 11 或更高版本,以便所有构造函数自动默认所有 struct 字段(CS0171、 CS0188、 CS0843 及其较新的对应项 CS8880、 CS8881、 CS8885)。 从 C# 11 开始,编译器会自动初始化构造函数中未显式设置为其默认值的任何字段。
如果无法升级到 C# 11(: this()、CS0188、CS0843),请在结构构造函数中使用显式调用默认构造函数。 此方法可确保所有字段在构造函数正文运行之前接收其默认值:
struct S
{
public int AIProp { get; set; }
public S(int i) : this() // Ensures all fields are initialized
{
AIProp = i;
}
}
在使用 this 或构造函数返回之前,为所有字段和自动属性赋值(CS9014、CS9015、CS9016、CS9017)。 当较新的编译器检测到某个属性或字段可能在被赋值之前就已被读取时,就会出现此类诊断信息。 请显式指定一个值,或升级到通过自动设定默认值来消除此警告的版本。
实现特定属性
- CS9269: UnscopedRefAttribute 仅在 C# 11 或更高版本或面向 net7.0 或更高版本时有效。
- CS9271:类型“Microsoft.CodeAnalysis.EmbeddedAttribute”必须是非泛型、内部的、不是文件本地类型的、密封的、非静态的,具有无参数构造函数,继承自 System.Attribute,并且能够应用于任何类型。
这些错误与以下属性有关:这些属性要么是由编译器生成的,要么与特定的运行时版本相关联。
升级到 C# 11 和 .NET 7 或更高版本以使用 UnscopedRefAttribute (CS9269)。 此属性表明,ref 返回值或 ref struct 参数不具有作用域生命周期。 它要求语言版本和目标框架满足最低要求。
请勿手动声明 Microsoft.CodeAnalysis.EmbeddedAttribute (CS9271)。 如果需要,编译器会自动生成此属性的源。 如果具有此名称的手动声明类型,请将其删除或重命名,以避免与编译器生成的版本冲突。