partial 类型和 partial 成员声明相关的错误和警告

有许多与 partial 类型和 partial 成员声明相关的错误

  • CS0260类型为“type”的声明上缺少分部修饰符;存在此类型的其他分部声明
  • CS0261“type”的分部声明必须是所有的类、所有的结构或所有的接口
  • CS0262“type”的分部声明包含冲突的可访问性修饰符
  • CS0263“type”的分部声明必须指定相同的基类
  • CS0264“type”的分部声明必须具有顺序相同的相同类型形参名
  • CS0265“type”的分部声明对类型参数“type parameter”具有不一致的约束
  • CS0267partial”修饰符只能出现在紧靠“class”、“record”、“struct”、“interface”或方法或属性返回类型前面的位置。
  • CS0282分部类或结构“type”的多个声明中的字段之间没有定义的排序。要指定排序,所有实例字段必须位于同一声明中。
  • CS0501“member function”必须声明主体,因为它未标记为 abstractexternpartial
  • CS0750分部成员不能有“abstract”修饰符。
  • CS0751必须在分部 class 或分部 struct 中声明分部成员
  • CS0754分部方法不能显式实现接口方法。
  • CS0755两个分部方法声明都必须是扩展方法,或者都不能是扩展方法。
  • CS0756分部方法不能有多个定义声明。
  • CS0757分部方法不能有多个实现声明。
  • CS0759没有为分部方法的实现声明找到定义声明。
  • CS0761method<T> 分部方法的声明具有不一致的类型参数约束。
  • CS0762:无法通过方法创建委托,因为该方法是没有实现声明的分部方法
  • CS0763两个分部方法声明必须都是 static,或者两者都不能是 static
  • CS0764两个分部方法声明必须都是 unsafe,或者两者都不能是 unsafe
  • CS1067分部声明必须具有顺序相同的相同类型形参名和差异修饰符。
  • CS8142这两个分部成员声明都必须使用相同的元组元素名称。
  • CS8663分部成员声明都必须为只读,或者两者都不能是只读
  • CS8796分部方法必须具有辅助功能修饰符,因为它具有非空返回类型。
  • CS8795 分部成员必须有一个实施部分,因为它具有辅助功能修饰符。
  • CS8797分部方法必须具有辅助功能修饰符,因为它具有“out”参数。
  • CS8798分部方法必须具有辅助功能修饰符,因为它具有“virtual”、“override”、“sealed”、“new”或“extern”修饰符。
  • CS8799这两个分部成员声明必须具有相同的辅助功能修饰符。
  • CS8800分部成员声明必须具有相同的 virtualoverridesealednew 修饰符组合。
  • 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”具有不一致的约束
  • CS0267partial”修饰符只能出现在紧靠“class”、“record”、“struct”、“interface”或方法或属性返回类型前面的位置。
  • CS8863只有一个分部类型声明可以拥有参数列表

你的分部类型声明可能会导致编译器发出以下警告:

  • CS0282分部 classstruct“type”的多个声明中的字段之间没有定义的排序。要指定排序,所有实例字段必须位于同一声明中。

对于任何分部类型,partial 关键字必须紧挨着 classrecordstructinterface 之前。 如果编译器按任何其他顺序显示,则会发出错误。 此外:

  • 分部类型的所有声明必须类型匹配(classstructrecord classrecord structreadonly structreadonly record struct)。
  • 所有声明都必须包含 partial 修饰符。
  • 泛型分部类型的声明必须按相同顺序包含相同的类型参数。

在类型的所有声明上,不需要重复声明的某些部分。 但是,如果这些元素在多个 partial 声明中重复,那么它们必须匹配:

  • 任何访问修饰符,例如 public
  • 任何基类或已实现的接口。
  • 对类型参数的任何约束。

最多可以在一个分部类型的声明上声明主要构造函数。

如果 partial struct 类型的多个文件中声明了多个字段,则编译器会发出警告。 如果布局顺序很重要,则必须在同一文件中声明所有字段。 如果顺序无关紧要,则可以将 System.Runtime.InteropServices.StructLayoutAttributeLayoutKind.Auto 值一起使用。

分部(成员)

  • CS0750 分部成员不能有“abstract”修饰符。
  • CS0751必须在分部 class 或分部 struct 中声明分部成员
  • CS0754分部方法不能显式实现接口方法。
  • CS0763两个分部方法声明必须都是 static,或者两者都不能是 static
  • CS0764两个分部方法声明必须都是 unsafe,或者两者都不能是 unsafe
  • CS8142这两个分部成员声明都必须使用相同的元组元素名称。
  • CS8663分部成员声明都必须为只读,或者两者都不能是只读
  • CS8799这两个分部成员声明必须具有相同的辅助功能修饰符。
  • CS8800分部成员声明必须具有相同的 virtualoverridesealednew 修饰符组合。
  • CS8818分部成员声明必须具有匹配的 ref 返回值。
  • CS8988参数的 scoped 修饰符与分部定义不匹配。

分部成员有两个声明。 没有实现的声明是声明声明。 具有实现的声明是 实现声明。 只允许在 partial 类型中使用分部成员。 分部成员不能为 abstract。 分部成员无法显式实现接口。 分部成员的两个声明都必须具有相同的签名。 例如,两个声明都可以或者都不能包含 staticunsafe 修饰符。

分部方法

  • CS0501“member function”必须声明主体,因为它未标记为 abstractexternpartial
  • CS0755两个分部方法声明都必须是扩展方法,或者都不能是扩展方法。
  • CS0756分部方法不能有多个定义声明。
  • CS0757分部方法不能有多个实现声明。
  • CS0759没有为分部方法的实现声明找到定义声明。
  • CS0761method<T> 分部方法的声明具有不一致的类型参数约束。
  • CS0762无法通过方法创建委托,因为该方法是没有实现声明的分部方法
  • CS1067分部声明必须具有顺序相同的相同类型形参名和差异修饰符。
  • CS8796分部方法必须具有辅助功能修饰符,因为它具有非空返回类型。
  • CS8795 分部成员必须有一个实施部分,因为它具有辅助功能修饰符。
  • CS8797分部方法必须具有辅助功能修饰符,因为它具有“out”参数。
  • CS8798分部方法必须具有辅助功能修饰符,因为它具有“virtual”、“override”、“sealed”、“new”或“extern”修饰符。
  • CS8817这两个分部方法声明必须具有相同的返回类型。

某些 partial 方法声明不需要实现声明。 也就是说,如果成员返回 void,则不声明任何访问修饰符(包括默认的 private 修饰符),并且不包含任何 virtualoverridesealednew 修饰符。 否则,任何分部方法都必须包括声明和实现声明。

当分部方法包含实现声明时,这两个声明必须相同。 只能定义一个实现声明。

分部属性

以下错误表示分部属性或索引器声明中的错误:

  • 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 关键字,但另一个使用手动声明的后盾字段。 该警告表明你可能偶然做到了。