可能会遇到与属性声明相关的以下错误:
- CS0200:属性或索引器“property”无法赋值 - 它是只读的
- CS0273:“accessor”访问器的可访问性修饰符必须比属性或索引器“property”的可访问性更严格
- CS0274: 不能为属性或索引器“property”的两个访问器指定可访问性修饰符
- CS0275: “访问器”:可访问性修饰符不能用于接口中的访问器
- CS0276:“property”:仅当属性或索引器同时具有 get 和 set 访问器时,才能在访问器上使用可访问性修饰符
- CS0442: “property”:抽象属性不能有专用访问器
- CS0544:“property”:无法重写,因为“member”不是属性
- CS0545:“function”:无法重写,因为“property”没有可重写的 get 访问器
- CS0546:“accessor”:无法重写,因为“property”没有可重写的 set 访问器
- CS0547: “property”:属性或索引器不能具有 void 类型
- CS0548: “property”:属性或索引器必须至少有一个访问器
- CS0571: “function”:无法显式调用运算符或访问器
- CS0610: 字段或属性的类型不能为“type”
- CS0840:“属性名称”必须声明一个主体,因为它未标记为 abstract 或 extern。自动实现的属性必须同时定义 get 和 set 访问器。
- CS1014:应为 get 或 set 访问器
- CS1043: { 或 ; 预期
- CS1715:“type”:类型必须为“type”以匹配重写的成员“member”
- CS8050: 只有自动实现的属性或使用“field”关键字的属性才能具有初始值设定项。
- CS8051: 自动实现的属性必须具有 get 访问器。
- CS8053: 接口中的实例属性不能有初始值设定项。
- CS8080:自动实现的属性必须重写被重写属性的所有访问器。
- CS8145: 自动实现的属性无法按引用返回
- CS8147: 按引用返回的属性不能有设值访问器
- CS8341: 只读结构中自动实现的实例属性必须是只读的。
- CS8657: 静态成员“member”不能标记为“readonly”。
- CS8658:自动实现的“set”访问器“accessor”无法标记为“只读”。
- CS8659:自动实现的属性“property”无法标记为“只读”,因为它具有“set”访问器。
- CS8660:无法在属性或索引器“property”及其访问器上同时指定“readonly”修饰符。请移除其中之一。
- CS8661:无法在属性或索引器“property”的两个访问器上同时指定“readonly”修饰符。应将“readonly”修饰符放在属性本身上。
- CS8664:“property”:仅当属性或索引器同时具有 get 和 set 访问器时,才能在访问器上使用“readonly”
- CS8852:init-only 属性或索引器“property”只能在对象初始器中,或在实例构造函数的“this”或“base”上,或在“init”访问器中赋值。
- CS8853:“member”必须与重写成员“member”的仅 init 特性相匹配
- CS8855:访问器“accessor”和“accessor”应均为仅 init,或均不为仅 init
- CS8856: “init”访问器对静态成员无效
- CS8903:“init”访问器无法标记为“只读”。请将“property”标记为只读。
- CS9029: 类型和别名不能命名为“required”。
- CS9030:“member”必须是必需的,因为它重写了必需成员“member”
- CS9031:必需成员“member”不能被“member”隐藏。
- CS9032:必需成员的可见性不得低于包含它的类型,或其 setter 的可见性不得低于包含它的类型。
-
CS9033: 请勿使用“
System.Runtime.CompilerServices.RequiredMemberAttribute'。请改用必填字段和属性上的“required”关键字。 - CS9034:必需成员必须是可设置的。
- CS9035: 必须在对象初始值设定项或属性构造函数中设置必需的成员。
- CS9036:必需的成员“memberName”必须被赋值,不能使用嵌套成员或集合初始化器。
- CS9037: “type”的必需成员列表格式不正确,无法解释。
-
CS9038: 基类型“type”的必需成员列表格式不正确,无法解释。若要使用此构造函数,请应用“
SetsRequiredMembers”属性。 -
CS9039: 此构造函数必须添加“”
SetsRequiredMembers,因为它链接到具有该属性的构造函数。 -
CS9040: 类型不能满足泛型类型或方法中参数的“
new()”约束,因为它具有必需的成员。 -
CS9042: 除非包含类型已过时或所有构造函数已过时,否则不应将必需成员归为“
ObsoleteAttribute”属性。 - CS9045:脚本或提交的顶层不允许使用必需成员。
-
CS9258:在此语言版本中,“
field”关键字绑定到属性的合成后盾字段。若要避免生成合成后盾字段,并引用现有成员,请改用“”this.field或“”。@field - CS9263:部分属性不能同时在定义和实现中具有初始化器。
以下是可能针对字段驱动属性生成的警告:
-
CS9264:非 null 属性“property”在退出构造函数时必须包含一个非 null 值。考虑添加“required”修饰符,或将属性声明为可为 null,亦或安全地处理“
field”访问器中“get”为 null 的情况。 -
CS9266:属性“property”的“accessor”访问器应使用“
field”,因为另一个访问器正在使用它。 -
CS9273: 在此语言版本中,“”
field是属性访问器中的关键字。重命名变量或使用标识符“@field”来改用。
以下部分介绍了这些错误和警告的原因和修复。
访问器可访问性
- CS0273:“accessor”访问器的可访问性修饰符必须比属性或索引器“property”的可访问性更严格
- CS0274: 不能为属性或索引器 'property' 的两个访问器分别指定访问修饰符
- CS0275: “访问器”:访问修饰符不能用于接口中的访问器
- CS0276:“property”:仅当属性或索引器同时具有 get 和 set 访问器时,才能在访问器上使用可访问性修饰符
- CS0442: “property”:抽象属性不能有专用访问器
这些错误强制实施了属性和索引器访问器的访问修饰符规则。 有关完整规则,请参阅 C# 规范中的限制访问器辅助功能和访问器。 若要更正这些错误,请根据特定诊断应用以下更改之一:
- 使用比属性声明的可访问性更严格的访问修饰符(CS0273)。 例如,一个
internal属性可以有一个privateset 访问器,但不能是public访问器。 访问器的可访问性必须是属性可访问性的真子集。 - 仅将访问修饰符应用于两个访问器之一(CS0274)。 属性声明本身为两个访问器建立了默认可访问性,只有一个访问器与该默认值不同。 将访问修饰符放在需要限制访问的访问器上。
- 从接口属性声明(CS0275)中的访问器中删除访问修饰符。 接口成员定义公共协定,不允许对单个访问器使用访问修饰符。 如果需要限制访问,请改为在实现类中应用限制。
- 在将访问修饰符应用于属性之前,先为属性添加
get和set访问器 (CS0276)。 访问器上的访问修饰符将一个访问器的可见性与其他访问器区分开来,这要求存在两个访问器。 如果该属性只有一个访问器,请从中删除访问修饰符。 - 将抽象属性访问器上的访问修饰符从
private更改为限制更少的修饰符(CS0442)。 派生类必须可访问抽象成员,以便这些类可以提供实现。 使用protected、internal或protected internal代替private。
属性声明语法
- CS0547: “property”:属性或索引器不能具有 void 类型
- CS0548: “property”:属性或索引器必须至少有一个访问器
- CS0571: “function”:无法显式调用运算符或访问器
- CS0610: 字段或属性的类型不能为“type”
- CS0840:“Property name”必须声明主体,因为它未被标记为抽象或外部。自动实现的属性必须定义 get 和 set 访问器。
- CS1014:应为 get 或 set 访问器
- CS1043: { 或 ; 预期的
这些错误迫使属性和索引器声明符合结构要求。 有关完整规则,请参阅 C# 规范的 “属性 ”和 “属性” 部分。 若要更正这些错误,请根据特定诊断应用以下更改之一:
- 将属性类型从
void更改为有效类型 (CS0547)。 属性和索引器表示表达式,void不是有效的表达式类型。 为属性表示的数据选择适当的类型。 - 至少为属性声明(
get)添加一个访问器(set、init或)。 没有任何访问器的属性无法读取或写入其值。 包括一个get访问器、一个set或init访问器,或两者兼有。 - 使用属性语法而不是直接调用访问器方法(CS0571)访问属性。 属性访问器编译为
get_PropertyName和set_PropertyName命名的方法,但通过属性语法(obj.Property和obj.Property = value)调用这些方法。 相同的原则适用于运算符。 使用运算符语法(++obj)而不是调用类似op_Increment的方法。 - 将字段或属性类型从受限类型更改为允许的类型(CS0610)。 某些类型(如 TypedReference 和 ArgIterator)不能用作字段或属性。 这些类型仍可用作方法参数或局部变量。
- 对于只读属性,请声明一个仅自动实现的
get属性。 否则,请将get和set两个访问器添加到自动实现的属性声明中,或提供显式访问器主体(CS0840)。 对于需要自定义逻辑的属性,请使用 C# 13 中添加的field关键字,以访问访问器主体中由编译器生成的支持字段。 对于abstract或extern属性,请移除访问器主体,因为实现由其他地方提供。 对于partial属性,将声明和实现拆分为分部类型声明。 - 确保属性正文仅包含有效的访问器关键字:
get、set,或者init(CS1014)。 属性主体不能包含任意语句或成员声明。 将属性外部的字段和方法移动到类或结构正文。 - 使用带大括号或表达式主体的正确属性访问器语法 (CS1043)。 访问器主体必须使用大括号
{ }、表达式体访问器必须使用=>语法,并且自动实现的属性必须在访问器令牌后以分号结尾。
有关详细信息,请参阅 “属性”、“ 自动实现的属性”和 “使用属性”。
属性重写
- CS0544: “property”:无法重写,因为“member”不是属性
- CS0545:“function”:无法重写,因为“property”没有可重写的 get 访问器
- CS0546:“accessor”:无法重写,因为“property”没有可重写的 set 访问器
- CS1715:“type”:类型必须为“type”以匹配重写的成员“member”
- CS8080:自动实现的属性必须重写被重写属性的所有访问器。
这些错误强制实施了派生类中重写属性的规则。 有关完整规则,请参阅 C# 规范的 “继承 ”和 “虚拟”、“密封”、“替代”和“抽象访问器 ”部分。 若要更正这些错误,请根据特定诊断应用以下更改之一:
- 确保要重写的成员是一个属性,而不是字段或方法(CS0544)。 属性
override上的关键字只能以基类中的virtual、abstract或override属性为目标。 要使用new关键字而不是override来用属性隐藏非属性成员。 - 仅重写基类属性声明中存在的访问器(CS0545、CS0546)。 您不能重写基类中不存在或不可访问的属性访问器,因为没有虚拟方法可供重写。 如果基类属性只有
get访问器,则不能通过重写添加set访问器。 要么将缺少的访问器添加到基类并标记为virtual,要么使用new通过新属性定义隐藏基类属性。 - 将重写属性的类型与被重写成员的类型进行匹配(CS1715)。 只读(
get-only)属性支持从 C# 9 开始的协变返回类型,因此重写可以返回更派生的类型。 但是,具有set或init访问器的属性需要完全类型匹配,因为 setter 接受声明类型的值。 如果需要对具有 setter 的属性使用不同的类型,请更改派生类中的属性类型以匹配基类声明,或删除 setter 并使用协变返回类型。 - 使用自动实现的属性重写时,请包含基类属性中的所有访问器 (CS8080)。 自动实现的属性会生成存储和访问器实现,因此它们必须重写基类中存在的所有访问器。 如果基属性具有
get和set这两个属性,则自动实现的重写也必须具有这两者。 要仅重写特定访问器,请使用显式访问器主体和显式后备字段来实现属性,而不是使用自动实现。 如果基类属性具有private访问器,则不能使用自动实现的属性替代该属性。 改用显式访问器主体。
有关详细信息,请参阅 “继承”、“ 属性”和 “使用属性”。
字段支持的属性
-
CS9258:在此语言版本中,“
field”关键字绑定到属性的合成后盾字段。若要避免生成合成后盾字段,并引用现有成员,请改用“”this.field或“”。@field - CS9263:分部属性不能在定义和实现上具有初始化器。
-
CS9264:非 null 属性“property”在退出构造函数时必须包含一个非 null 值。考虑添加“required”修饰符,或将属性声明为可为 null,亦或安全地处理“
field”访问器中“get”为 null 的情况。 -
CS9266:属性“property”的“accessor”访问器应使用“
field”,因为另一个访问器正在使用它。 -
CS9273: 在此语言版本中,“”
field是属性访问器中的关键字。重命名变量或使用标识符“@field”来改用。
要纠正字段支持的属性错误,请根据具体的诊断信息应用以下更改之一:
- 重命名任意名为
field的变量为不同的标识符,或使用@field转义语法引用您的变量(CS9258、CS9273)。 此更正是必需的,因为在 C# 13 及更高版本中的属性访问器中,field是一个上下文关键字,它指的是由编译器生成的后备字段。 如果要访问名为field而不是合成后备字段的现有成员,请将其限定this.field为消除引用歧义。 - 从部分属性定义或实现中删除初始值设定项,只保留一个(CS9263)。 此更正是必需的,因为允许在两个位置使用初始化器会产生关于应使用哪个值的歧义,并可能导致后备字段两次被初始化为可能不同的值。
- 将
[field: MaybeNull, AllowNull]属性添加到属性声明,以指示应将后盾字段视为可为 null(CS9264)。 此更正使属性类型与编译器合成的后备字段之间的可为 null 性预期保持一致,解决了属性被声明为非 null 但field关键字的使用暗示其可能为 null 的不匹配问题。 或者,将属性类型更改为可为 null,添加required修饰符以确保初始化,或者在构造函数中初始化属性。 - 始终在两个访问器中使用
field关键字,或者在两个访问器中一致使用显式后备字段(CS9266)。 此更正可防止潜在的错误,其中一个访问器修改由编译器合成的后备字段,而另一个访问器修改不同的存储位置,从而导致属性行为不一致。
Readonly 属性
- CS0200:属性或索引器“property”无法分配,因为它是只读的
- CS8341: 只读结构中自动实现的实例属性必须是只读的。
- CS8657: 静态成员“member”不能标记为“readonly”。
- CS8658:自动实现的“set”访问器“accessor”无法标记为“只读”。
- CS8659:自动实现的属性“property”无法标记为“只读”,因为它具有“set”访问器。
- CS8660:无法在属性或索引器“property”及其访问器上同时指定“readonly”修饰符。请移除其中之一。
- CS8661:无法在属性或索引器“property”的两个访问器上同时指定“readonly”修饰符。应将“readonly”修饰符放在属性本身上。
- CS8664:“property”:仅当属性或索引器同时具有 get 和 set 访问器时,才能在访问器上使用“readonly”
若要更正只读属性错误,请根据特定诊断应用以下更改之一:
- 为属性添加
set或init访问器以使其可写(CS0200)。 此更正是必要的,因为没有 set 访问器的属性是只读的,只能在声明类型的构造函数或字段初始化器中赋值。 如果需要在对象初始化期间设置属性,但之后不可变,请使用init访问器而不是set访问器。 如果属性应保持只读状态,请将赋值移到允许初始化的构造函数中,或重新考虑是否有必要分配。 - 在
readonly中声明自动实现的实例属性时,请将其标记为readonly struct(CS8341)。 此更正强制实施包含结构的不可变性协定,确保所有实例成员都遵守readonly保证。 如果属性需要可变,请从结构声明中删除readonly修饰符,或者使用不修改实例状态的显式后盾字段和访问器正文实现该属性。 -
readonly从静态属性或访问器声明中删除修饰符(CS8657)。 此更正是必需的,因为readonly修饰符仅应用于结构体的实例成员,以指示它们不会修改实例状态,而静态成员没有要保护的实例状态。 如果需要只读静态属性,只需省略set访问器而不是使用readonly修饰符。 - 从自动实现的
readonly访问器中移除set修饰符,或者仅将其应用于get访问器(CS8658)。 此修正是必要的,因为set访问器本质上会修改状态,这与保证实例状态不被修改的修饰符readonly的用途相矛盾。 如果需要可以在初始化期间设置但之后为只读的属性,请使用init访问器而不是set访问器。 - 从属性声明中删除
readonly修饰符,当属性具有set访问器时(CS8659)。 此更正是必需的,因为具有set访问器的属性可以修改实例状态,这违反了readonly保证。 如果需要仅初始化时设置,请将set访问器替换为init访问器,或者完全删除set访问器以使属性真正只读。 - 将
readonly修饰符放在属性声明或单个访问器上,但不能同时放在两者上(CS8660、CS8661)。 此更正可防止冗余修饰符声明,这些声明可能会造成对哪些修饰符优先的混淆。 如果要将特定访问器readonly标记为,请从属性声明中删除修饰符,并将其仅放置在访问器上。 或者,如果所有访问器都应是readonly,则标记属性本身,而不是单个访问器。 - 在将单个访问器标记为
get时,请确保set和readonly访问器均存在(CS8664)。 此更正是必要的,因为readonly修饰符在单个访问器上用于区分修改状态的访问器和不修改状态的访问器。只有当两种类型的访问器同时存在时,这种区分才有意义。 如果属性仅有get访问器,请将其标记为readonly,而不是仅标记单个访问器。
仅限 Init 的属性
- CS8852:初始化属性或索引器“property”只能在对象初始化器中赋值,或者在实例构造函数或“init”访问器中对“this”或“base”赋值。
- CS8853:“member”必须与重写成员“member”的仅 init 特性相匹配
- CS8855:访问器“accessor”和“accessor”应均为仅 init,或均不为仅 init
- CS8856: “init”访问器对静态成员无效
- CS8903:“init”访问器无法标记为“只读”。请将“property”标记为只读。
这些错误强制实施了 init 访问器的规则,该访问器支持不可变对象的初始化。 有关完整规则,请参阅 init 关键字。 若要更正这些错误,请根据特定诊断应用以下更改之一:
- 将赋值移到对象初始值设定项、构造函数或
init访问器中 (CS8852)。 对象构造完成后,无法设置仅限初始化的属性。 在构造函数主体、init访问器或对象初始值设定项表达式(new MyType { Property = value })中赋值。 如果需要在构造后分配属性,请将init访问器更改为set访问器。 - 重写属性时,请匹配
init或set访问器种类 (CS8853)。 如果基类属性使用init访问器,则重写属性也必须使用init。 同样,如果基数使用set,则重写必须使用set。 此一致性可确保基类型建立的不可变性协定在派生类型中保留。 - 在显式接口实现(
init)中对两个访问器使用相同的访问器类型set(或)。 当类型显式实现声明同一属性的两个接口时,两个访问器实现必须保持一致:两者都使用init或两者都使用set。 -
init从静态属性声明中删除访问器,或将其更改为set访问器(CS8856)。init访问器设计用于与对象构造绑定的实例初始化模式,而静态成员不参与对象初始化。 对可变的静态属性使用set访问器,或者对只读的静态属性完全移除 setter。 - 从
readonly访问器中删除init修饰符(CS8903)。readonly结构成员上的修饰符保证该成员不会改变结构实例。 因为init访问器会赋值给实例状态,它本质上会改变结构体,因此不能标记为readonly。 若要将get访问器变为readonly,请仅将readonly修饰符应用于get访问器。
有关详细信息,请参阅 init 关键字 和 对象和集合初始值设定项。
属性初始化
- CS8050: 只有自动实现的属性或使用“field”关键字的属性才能具有初始值设定项。
- CS8051:自动实现的属性必须具有 get 访问器。
- CS8053: 接口中的实例属性不能有初始值设定项。
若要更正属性初始值设定项错误,请根据特定诊断应用以下更改之一:
- 通过移除访问器主体并让编译器生成后备字段,将属性转换为使用自动实现语法 (CS8050)。 之所以需要这种更正,是因为只有具有编译器托管存储的属性才能具有初始值设定项,确保在执行任何访问器逻辑之前进行初始化。 或者,修改访问器实现以使用
field关键字访问编译器合成后备字段。 此方法在保持自定义访问器逻辑的同时启用了初始值设定项。 如果两种方法都不适合,请删除初始值设定项并在构造函数中分配值,在该构造函数中可以完全控制初始化序列。 - 向自动实现的属性添加一个
get访问器,以便能够读取初始化值(CS8051)。 必须进行此更正,因为初始值设定项设置一个必须检索的值,而仅写属性违反了对属性初始化的基本期望。 如果确实需要一个仅写入属性,请使用支持字段显式实现访问器,并在构造函数中直接分配字段,而不是使用属性初始化器。 - 从接口属性声明中删除初始值设定项(CS8053)。 此更正是必要的,因为接口定义的是实现类型的协定,而不是提供带有初始值的具体实现。 如果需要提供默认值,在实现接口的类中实现属性,或使用默认接口方法(在 C# 8.0 及更高版本中可用)提供默认实现。
有关详细信息,请参阅 属性、 自动实现的属性和 字段关键字。
必需的成员
- CS9029:类型和别名不能以“required”命名。
- CS9030:“member”必须是必需的,因为它重写了必需成员“member”
- CS9031:必需成员“member”不能被“member”隐藏。
- CS9032:必需成员的可见性不得低于包含它的类型,或其 setter 的可见性不得低于包含它的类型。
-
CS9033: 请勿使用“
System.Runtime.CompilerServices.RequiredMemberAttribute'。请改用必填字段和属性上的“required”关键字。 - CS9034:必需成员必须是可设置的。
- CS9035: 必须在对象初始值设定项或属性构造函数中设置必需的成员。
- CS9036: 要求的成员“memberName”必须被赋值,不能使用嵌套成员或集合初始化器。
- CS9037: “type”的必需成员列表格式不正确,无法解释。
-
CS9038: 基类型“type”的必需成员列表格式不正确,无法解释。若要使用此构造函数,请应用“
SetsRequiredMembers”属性。 -
CS9039: 此构造函数必须添加“”
SetsRequiredMembers,因为它链接到具有该属性的构造函数。 -
CS9040: 类型不能满足泛型类型或方法中参数的“
new()”约束,因为它具有必需的成员。 -
CS9042: 除非包含类型已过时或所有构造函数已过时,否则不应将必需成员归为“
ObsoleteAttribute”属性。 - CS9045:脚本或提交的顶层不允许使用必需成员。
若要更正所需的成员错误,请根据特定诊断应用以下更改之一:
- 避免用作
required类型或别名(CS9029)。 此更正是必需的,因为在 C# 11 及更高版本中,required是一个上下文关键字,将其用作类型名称会在代码中出现时造成歧义。 - 确保在重写必需成员时,派生成员保留
required修饰符 (CS9030)。 此更正强制执行基类建立的协定,保证所有派生类型都保持相同的初始化要求。 避免在派生类(CS9031)中使用非必需成员来隐藏必需成员,因为这样会破坏使用者从基类型期望的初始化协议。 - 使必需的成员至少与其包含的类型一样可见,并确保属性设置器也足够可见(CS9032)。 此更正防止了类型可公开访问,但其必需成员无法在构造该类型的所有上下文中初始化的情况。
- 请使用
required关键字,而不要手动应用RequiredMemberAttribute(CS9033)。 此更正可确保编译器生成正确的元数据并强制实施所有必需的成员规则,手动属性应用程序可能无法正确执行这些规则。 - 确保必需成员具有 set 访问器或以其他方式可设置 (CS9034)。 必须进行此更正,因为必须在创建对象期间初始化所需的成员,这需要写入访问权限。 创建实例时,直接在对象初始值设定项(CS9035、 CS9036)中初始化所需的成员。 必须为每个必需成员分配一个值,而不是使用嵌套成员初始化器或集合初始化器,因为必须在访问其属性之前先设置必需成员本身。
- 将
SetsRequiredMembers属性应用于初始化其主体中的所有必需成员的构造函数(CS9038,CS9039)。 此更正通知编译器构造函数满足所需的成员协定,从而允许在没有对象初始值设定项的情况下创建对象。 如果构造函数链接到另一个构造函数SetsRequiredMembers,则它还必须具有该属性。 - 避免在必须满足
new()约束的类型中使用必需的成员(CS9040),因为无参数构造函数不能保证在没有对象初始值设定项的情况下进行所需的成员初始化。 除非包含的类型或所有构造函数已过时(CS9042),否则不要将所需成员标记为已过时,以防止出现需要成员但不建议使用这些成员的情况。 顶级语句或脚本上下文中不允许必需的成员(CS9045),因为这些上下文不支持设置所需成员所需的对象初始化语法。
有关详细信息,请参阅 所需的修饰符 参考文章和 对象和集合初始值设定项 指南。
引用返回属性
- CS8145: 自动实现的属性无法按引用返回
- CS8147:按引用返回的属性不能具有 set 访问器
若要更正 ref-returning 属性错误,请根据特定诊断应用以下更改之一:
- 使用后盾字段显式实现该属性,并在访问器的返回表达式(
ref中使用get关键字。 这个修正是必要的,因为自动实现的属性功能会生成编译器在内部负责管理的私有后台字段。 返回私有字段的引用将暴露内部存储,调用方不应直接访问这些存储。 若要创建 ref-returning 属性,请声明一个显式字段,并使用语法返回它=> ref backingField。 或者,如果不需要返回引用以允许直接修改存储,请从属性声明中删除ref修饰符。 - 从返回引用的属性中删除
set访问器(CS8147)。 此更正是必要的,因为按引用返回的属性已经通过返回的引用本身提供了读写访问权限。 调用方可以直接通过引用修改值,而无需单独的 setter 方法。 包含set访问器将为修改同一存储创建两种不同的机制,这是多余的,并且可能导致关于应使用哪个修改路径的混淆。
有关详细信息,请参阅 ref 返回和 ref 局部变量 和 属性。