CS8022、CS8023、CS8024、CS8025、CS8026、CS8059、CS8107、CS8302、CS8320、CS8370、CS8400、CS8773、CS8936、CS9058
-
功能不可用。使用较新的语言版本。
CS8192
-
提供的语言版本不受支持或无效
CS8303
-
指定的语言版本不能有前导零
CS8304
-
编译器版本小于语言版本
CS1738
-
指定所有固定参数后,必须显示命名参数规范。
CS8306
-
推断元组元素名称。
CS8314
-
类型的表达式不能由 类型的模式处理
CS8371
-
语言版本不支持自动属性上的字段目标属性
CS8401
-
若要对内插逐字字符串使用
@$
而不是
$@
,请使用较新的语言版本。
CS8511
-
类型的表达式不能由 类型的模式处理。
CS8627
-
可以为 null 的类型参数必须已知为值类型或不可为 null 的引用类型
CS8630
-
无效的可为 null 选项。使用较新的语言版本
CS8652
-
修饰符对此项无效。
CS8704
-
类型不实现接口成员。它无法隐式实现非公共成员。
CS8706
-
类型无法实现接口成员,因为某个功能在此版本中不可用。
CS8904
-
方差无效:类型参数必须有效。
CS8912
-
不支持从具有密封的“Object.ToString”的记录继承。
CS8957
-
条件表达式在语言版本中无效,因为在类型之间找不到通用类型。
CS8967
-
C# 中不支持非逐字内插字符串中的换行符
CS9014
-
错误:使用可能未分配的属性。升级到自动默认 属性。
CS9015
-
错误:使用可能未分配的字段。升级到自动默认字段。
CS9016
-
警告:使用可能未分配的属性。升级到自动默认 属性。
CS9017
-
警告:使用可能未分配的字段。升级到自动默认字段。
此外,以下错误和警告与最新版本中的结构初始化更改相关:
CS0171
、
CS8881
:
在将控制权返回给调用方之前,必须完全分配自动实现的属性“name”的后备字段。
CS0188
、
CS8885
:
在将“this”对象的所有字段分配到之前,不能使用该对象
CS0843
、
CS8880
:
在将控制权返回给调用方之前,必须完全分配自动实现的属性“name”的后备字段
所有这些错误和警告背后的原因是安装的编译器支持比项目选择的版本更新的 C# 版本。 C# 编译器可以符合任何以前的版本。 可以针对早期版本的 C# 验证语法,或者因为项目必须支持较旧的库或运行时。
解决这些错误和警告有两种可能的原因和三种方法。
更新目标框架
编译器根据以下规则确定默认值:
C# 语言版本的默认值
如果必须支持较旧的库或运行时,则可能需要避免使用较新的功能。
结构初始化的重大更改
所有这些错误和警告都有助于确保在
struct
访问其字段之前正确初始化类型。 在早期版本的 C# 中,必须在任何构造函数中显式分配结构中的所有字段。 无参数构造函数将所有字段初始化为其默认值。 在更高版本中,所有构造函数初始化所有字段。 显式设置字段,在字段初始值设定项中设置,或设置为其默认值。
CS0171
、
CS8881
:
在将控制权返回给调用方之前,必须完全分配自动实现的属性“name”的后备字段。
CS0188
、
CS8885
:
在将“this”对象的所有字段分配到之前,不能使用该对象
CS0843
、
CS8880
:
在将控制权返回给调用方之前,必须完全分配自动实现的属性“name”的后备字段
当每个
struct
构造函数初始化所有字段时,可以通过将语言版本升级到 C# 11 来解决此错误。 如果这不是可能的选项,则必须显式调用默认构造函数,如以下示例所示:
struct S
public int AIProp { get; set; }
public S(int i){} //CS0843
// Try the following lines instead.
// public S(int i) : this()
// AIProp = i;
class Test
static int Main()
return 1;