与 partial
类型和 partial
成员声明相关的错误和警告
有许多与 partial
类型和 partial
成员声明相关的错误:
- CS0260:类型为“type”的声明上缺少分部修饰符;存在此类型的其他分部声明
- CS0261:“type”的分部声明必须是所有的类、所有的结构或所有的接口
- CS0262:“type”的分部声明包含冲突的可访问性修饰符
- CS0263:“type”的分部声明必须指定相同的基类
- CS0264:“type”的分部声明必须具有顺序相同的相同类型形参名
- CS0265:“type”的分部声明对类型参数“type parameter”具有不一致的约束
- CS0267:“
partial
”修饰符只能出现在紧靠“class
”、“record
”、“struct
”、“interface
”或方法或属性返回类型前面的位置。 - CS0282:分部类或结构“type”的多个声明中的字段之间没有定义的排序。要指定排序,所有实例字段必须位于同一声明中。
- CS0501:“member function”必须声明主体,因为它未标记为
abstract
、extern
或partial
- CS0750:分部成员不能有“
abstract
”修饰符。 - CS0751:必须在分部
class
或分部struct
中声明分部成员 - CS0754:分部方法不能显式实现接口方法。
- CS0755:两个分部方法声明都必须是扩展方法,或者都不能是扩展方法。
- CS0756:分部方法不能有多个定义声明。
- CS0757:分部方法不能有多个实现声明。
- CS0759:没有为分部方法的实现声明找到定义声明。
- CS0761:
method<T>
分部方法的声明具有不一致的类型参数约束。 - CS0762:无法通过方法创建委托,因为该方法是没有实现声明的分部方法
- CS0763:两个分部方法声明必须都是
static
,或者两者都不能是static
。 - CS0764:两个分部方法声明必须都是
unsafe
,或者两者都不能是unsafe
。 - CS1067:分部声明必须具有顺序相同的相同类型形参名和差异修饰符。
- CS8142:这两个分部成员声明都必须使用相同的元组元素名称。
- CS8663:分部成员声明都必须为只读,或者两者都不能是只读
- CS8796:分部方法必须具有辅助功能修饰符,因为它具有非空返回类型。
- CS8795: 分部成员必须有一个实施部分,因为它具有辅助功能修饰符。
- CS8797:分部方法必须具有辅助功能修饰符,因为它具有“
out
”参数。 - CS8798:分部方法必须具有辅助功能修饰符,因为它具有“
virtual
”、“override
”、“sealed
”、“new
”或“extern
”修饰符。 - CS8799:这两个分部成员声明必须具有相同的辅助功能修饰符。
- CS8800:分部成员声明必须具有相同的
virtual
、override
和sealed
new
修饰符组合。 - CS8817:这两个分部方法声明必须具有相同的返回类型。
- CS8818:分部成员声明必须具有匹配的
ref
返回值。 - CS8863:只有一个分部类型声明可以拥有参数列表
- CS8988:参数的
scoped
修饰符与分部定义不匹配。 - CS9248:分部属性必须具有实现部分。
- CS9249:分部属性必须具有定义部件。
- CS9250:分部属性可能没有多个定义声明,不能是自动属性。
- CS9251:分部属性不能有多个实现声明
- CS9252:必须实现分部属性访问器,因为在定义部件上声明了它
- CS9253:属性访问器不会实现在定义部件上声明的任何访问器
- CS9254:属性访问器必须与定义部件匹配
- CS9255:两个分部属性声明必须具有相同的类型。
- CS9256:分部属性声明有签名差异。
- CS9257:必须同时要求这两个分部属性声明,或者都不需要这两个声明
- CS9258:在此语言版本中,“
field
”关键字绑定到属性的合成后盾字段。若要避免生成合成后盾字段,并引用现有成员,请改用“”this.field
或“”。@field
- CS9263: 部分属性不能对定义和实现具有初始值设定项。
可以为字段支持的属性生成以下警告:
- CS9264: 退出构造函数时,不可为 null 的属性必须包含非 null 值。请考虑添加“必需”修饰符,或将属性声明为可为 null,或添加“
[field: MaybeNull, AllowNull]
”属性。* - CS9266: 属性的一个访问器应使用“”
field
,因为另一个访问器正在使用它。
以下部分介绍了这些错误和警告的原因和修复。
分部类型
- CS0260:类型为“type”的声明上缺少分部修饰符;存在此类型的其他分部声明
- CS0261:“type”的分部声明必须是所有的类、所有的结构或所有的接口
- CS0262:“type”的分部声明包含冲突的可访问性修饰符
- CS0263:“type”的分部声明必须指定相同的基类
- CS0264:“type”的分部声明必须具有顺序相同的相同类型形参名
- CS0265:“type”的分部声明对类型参数“type parameter”具有不一致的约束
- CS0267:“
partial
”修饰符只能出现在紧靠“class
”、“record
”、“struct
”、“interface
”或方法或属性返回类型前面的位置。 - CS8863:只有一个分部类型声明可以拥有参数列表
你的分部类型声明可能会导致编译器发出以下警告:
- CS0282:分部
class
或struct
“type”的多个声明中的字段之间没有定义的排序。要指定排序,所有实例字段必须位于同一声明中。
对于任何分部类型,partial
关键字必须紧挨着 class
、record
、struct
或 interface
之前。 如果编译器按任何其他顺序显示,则会发出错误。 此外:
- 分部类型的所有声明必须类型匹配(
class
、struct
、record class
、record struct
、readonly struct
或readonly record struct
)。 - 所有声明都必须包含
partial
修饰符。 - 泛型分部类型的声明必须按相同顺序包含相同的类型参数。
在类型的所有声明上,不需要重复声明的某些部分。 但是,如果这些元素在多个 partial
声明中重复,那么它们必须匹配:
- 任何访问修饰符,例如
public
。 - 任何基类或已实现的接口。
- 对类型参数的任何约束。
最多可以在一个分部类型的声明上声明主要构造函数。
如果 partial struct
类型的多个文件中声明了多个字段,则编译器会发出警告。 如果布局顺序很重要,则必须在同一文件中声明所有字段。 如果顺序无关紧要,则可以将 System.Runtime.InteropServices.StructLayoutAttribute 与 LayoutKind.Auto 值一起使用。
分部(成员)
- CS0750: 分部成员不能有“
abstract
”修饰符。 - CS0751:必须在分部
class
或分部struct
中声明分部成员 - CS0754:分部方法不能显式实现接口方法。
- CS0763:两个分部方法声明必须都是
static
,或者两者都不能是static
。 - CS0764:两个分部方法声明必须都是
unsafe
,或者两者都不能是unsafe
- CS8142:这两个分部成员声明都必须使用相同的元组元素名称。
- CS8663:分部成员声明都必须为只读,或者两者都不能是只读
- CS8799:这两个分部成员声明必须具有相同的辅助功能修饰符。
- CS8800:分部成员声明必须具有相同的
virtual
、override
、sealed
和new
修饰符组合。 - CS8818:分部成员声明必须具有匹配的
ref
返回值。 - CS8988:参数的
scoped
修饰符与分部定义不匹配。
分部成员有两个声明。 没有实现的声明是声明声明。 具有实现的声明是 实现声明。 只允许在 partial
类型中使用分部成员。 分部成员不能为 abstract
。 分部成员无法显式实现接口。 分部成员的两个声明都必须具有相同的签名。 例如,两个声明都可以或者都不能包含 static
或 unsafe
修饰符。
分部方法
- CS0501:“member function”必须声明主体,因为它未标记为
abstract
、extern
或partial
- CS0755:两个分部方法声明都必须是扩展方法,或者都不能是扩展方法。
- CS0756:分部方法不能有多个定义声明。
- CS0757:分部方法不能有多个实现声明。
- CS0759:没有为分部方法的实现声明找到定义声明。
- CS0761:
method<T>
分部方法的声明具有不一致的类型参数约束。 - CS0762:无法通过方法创建委托,因为该方法是没有实现声明的分部方法
- CS1067:分部声明必须具有顺序相同的相同类型形参名和差异修饰符。
- CS8796:分部方法必须具有辅助功能修饰符,因为它具有非空返回类型。
- CS8795: 分部成员必须有一个实施部分,因为它具有辅助功能修饰符。
- CS8797:分部方法必须具有辅助功能修饰符,因为它具有“
out
”参数。 - CS8798:分部方法必须具有辅助功能修饰符,因为它具有“
virtual
”、“override
”、“sealed
”、“new
”或“extern
”修饰符。 - CS8817:这两个分部方法声明必须具有相同的返回类型。
某些 partial
方法声明不需要实现声明。 也就是说,如果成员返回 void
,则不声明任何访问修饰符(包括默认的 private
修饰符),并且不包含任何 virtual
、override
、sealed
或 new
修饰符。 否则,任何分部方法都必须包括声明和实现声明。
当分部方法包含实现声明时,这两个声明必须相同。 只能定义一个实现声明。
分部属性
以下错误表示分部属性或索引器声明中的错误:
- CS9248:分部属性必须具有实现部分。
- CS9249:分部属性必须具有定义部件。
- CS9250:分部属性可能没有多个定义声明,不能是自动属性。
- CS9251:分部属性不能有多个实现声明
- CS9252:必须实现分部属性访问器,因为在定义部件上声明了它
- CS9253:属性访问器不会实现在定义部件上声明的任何访问器
- CS9254:属性访问器必须与定义部件匹配
- CS9255:两个分部属性声明必须具有相同的类型。
- CS9257:必须同时要求这两个分部属性声明,或者都不需要这两个声明
以下警告指示了在分部属性中声明和实现声明的签名差异:
- CS9256:分部属性声明有签名差异。
分部属性或索引器必须都具有声明声明和实现声明。 这两个声明的签名必须匹配。 由于声明声明使用的语法与自动实现的属性相同,因此实现声明不能是自动实现的属性。 访问器必须至少有一个访问器主体。 从 C# 13 开始,可以使用 field
关键字通过简洁的语法声明一个访问器:
public partial int ImplementingDeclaration { get => field; set; }
字段支持的属性
- CS9258:在此语言版本中,“
field
”关键字绑定到属性的合成后盾字段。若要避免生成合成后盾字段,并引用现有成员,请改用“”this.field
或“”。@field
- CS9263: 部分属性不能对定义和实现具有初始值设定项。
- CS9264: 退出构造函数时,不可为 null 的属性必须包含非 null 值。请考虑添加“必需”修饰符,或将属性声明为可为 null,或添加“
[field: MaybeNull, AllowNull]
”属性。* - CS9266: 属性的一个访问器应使用“”
field
,因为另一个访问器正在使用它。
重要
关键字 field
是 C# 13 中的预览功能。 必须使用 .NET 9 并将元素preview
设置为<LangVersion>
项目文件中,才能使用field
上下文关键字。
应注意在 field
具有名为 field
字段的类中使用关键字功能。 新 field
关键字将隐藏属性访问器范围中命名 field
的字段。 可以更改变量的名称 field
,或使用 @
令牌将标识符引用 field
为 @field
。 可以通过阅读关键字的功能规范field
来了解详细信息。
从 C# 13 开始,预览功能 field
支持的属性允许访问属性的编译器合成后备字段。 CS9258 指示你有一个名为的变量,该变量 field
可由上下文关键字 field
隐藏。
CS9263 指示声明包括实现。 该实现可能正在访问该属性的编译器合成后盾字段。 CS9264 指示在属性声明可为 null 时,使用 field
假定不可为 null 的后盾字段。 编译器假定后备字段和属性具有相同的可为 null 性。 需要将 [field:MaybeNull, AllowNull]
属性添加到属性声明,以 field
指示值应被视为可为 null。 CS9266 指示其中一个属性访问器使用 field
关键字,但另一个使用手动声明的后盾字段。 该警告表明你可能偶然做到了。