通过


解决扩展成员声明中的错误和警告

本文介绍以下编译器错误:

  • CS1100方法具有参数修饰符“this”,该修饰符不在第一个参数上
  • CS1101参数修饰符“”ref不能与“”this一起使用。
  • CS1102参数修饰符“”out不能与“”this一起使用。
  • CS1103扩展方法的第一个参数不能是指针类型。
  • CS1105扩展方法必须是静态的。
  • CS1106扩展方法必须在非泛型静态类中定义。
  • CS1109扩展方法必须在顶级静态类上定义,“name”是嵌套类。
  • CS1110无法定义新扩展,因为找不到编译器所需的类型 ExtensionAttribute 。是否缺少对 System.Core.dll的引用?
  • CS1112请勿使用“ExtensionAttribute”。请改用“this”关键字。
  • CS1113不能使用对值类型定义的扩展方法来创建委托。
  • CS1743无法为“this”参数指定默认值。
  • CS9281扩展声明可能没有名称。
  • CS9282扩展声明只能包含方法或属性。
  • CS9283必须在顶级非泛型静态类中声明扩展。
  • CS9284扩展的接收方参数不能有默认值。
  • CS9285扩展容器只能有一个接收方参数。
  • CS9287接收方参数不能与扩展容器类型参数同名。
  • CS9288参数、局部变量或本地函数不能与扩展容器类型参数同名。
  • CS9289成员类型参数的名称与扩展容器类型参数相同。
  • CS9290参数、局部变量或本地函数不能与扩展参数同名。
  • CS9291value:自动生成的参数名称与扩展参数名称冲突。
  • CS9292类型参数的名称与扩展参数相同。
  • CS9293不能在此上下文中使用扩展参数。
  • CS9294value:自动生成的参数名称与扩展类型参数名称冲突。
  • CS9295扩展类型必须引用扩展声明的所有类型参数,但不引用类型参数。
  • CS9300扩展块的“”ref接收方参数必须是值类型或受结构约束的泛型类型。
  • CS9301扩展的“”in或“”ref readonly接收方参数必须是具体的(非泛型)值类型。
  • CS9302扩展块中声明的新受保护成员。
  • CS9303无法使用未命名接收器参数在扩展块中声明实例成员。
  • CS9304无法在扩展块中声明仅初始化访问器。
  • CS9305不能对扩展块的未命名接收方参数使用修饰符。
  • CS9306类型和别名不能命名为“extension”。
  • CS9309不允许在扩展成员语法中的嵌套位置使用扩展成员语法。
  • CS9316不允许将扩展成员作为“”nameof参数。
  • CS9317一元运算符的参数必须是扩展类型。
  • CS9318++ 或 -- 运算符的参数类型必须是扩展类型。
  • CS9319二进制运算符的参数之一必须是扩展类型。
  • CS9320重载移位运算符的第一个操作数必须与扩展类型具有相同的类型。
  • CS9321扩展静态类的扩展块不能包含用户定义的运算符。
  • CS9322除非包含扩展块接收器参数是“”ref参数,否则无法为结构声明实例运算符。
  • CS9323无法为一种未知是否为结构或类的类型声明实例扩展运算符。
  • CS9326name:扩展成员名称不能与其扩展类型相同。
  • CS9329此扩展块与其他扩展块相冲突。它们会导致元数据中基于内容的类型名称冲突。
  • CS9339扩展解析在以下成员之间不明确。

扩展声明的常见错误

  • CS1102参数修饰符“”out不能与“”this一起使用。
  • CS1103扩展方法的第一个参数不能是指针类型。
  • CS1106扩展方法必须在非泛型静态类中定义。
  • CS1109扩展方法必须在顶级静态类上定义,“name”是嵌套类。
  • CS1113不能使用对值类型定义的扩展方法来创建委托。
  • CS1743无法为“this”参数指定默认值。
  • CS9283必须在顶级非泛型静态类中声明扩展。
  • CS9284扩展的接收方参数不能有默认值。
  • CS9285扩展容器只能有一个接收方参数。

当你违反适用于所有扩展成员声明的规则时,编译器会发出这些错误,而不管选择哪种语法。 有关详细信息,请参阅 扩展方法

若要正确声明扩展成员,请遵循以下要求:

  • 将包含类型声明为非泛型 static 类或结构(CS1106CS9283)。
  • 在顶层声明包含的类型,而不是将其嵌套在另一类型中(CS1109CS9283)。
  • 不要将值类型的扩展方法转换为委托(CS1113)。 请改为创建常规方法。
  • 不要在 out 接收方参数上使用参数修饰符(CS1102)。
  • 不要为接收方参数(CS1743CS9284)提供默认值。
  • 不要扩展指针类型(CS1103)。 将修饰符应用到 this 的参数不能是指针类型。
  • 每个扩展容器(CS9285)只声明一个接收方参数。
  • CS9281扩展声明可能没有名称。
  • CS9282扩展声明只能包含方法或属性。
  • CS9287接收方参数不能与扩展容器类型参数同名。
  • CS9288参数、局部变量或本地函数不能与扩展容器类型参数同名。
  • CS9289成员类型参数的名称与扩展容器类型参数相同。
  • CS9290参数、局部变量或本地函数不能与扩展参数同名。
  • CS9291value:自动生成的参数名称与扩展参数名称冲突。
  • CS9292类型参数的名称与扩展参数相同。
  • CS9293不能在此上下文中使用扩展参数。
  • CS9294value:自动生成的参数名称与扩展类型参数名称冲突。
  • CS9295扩展类型必须引用扩展声明的所有类型参数,但不引用类型参数。
  • CS9300扩展块的“”ref接收方参数必须是值类型或受结构约束的泛型类型。
  • CS9301扩展的“”in或“”ref readonly接收方参数必须是具体的(非泛型)值类型。
  • CS9302扩展块中声明的新受保护成员。
  • CS9303无法使用未命名接收器参数在扩展块中声明实例成员。
  • CS9304无法在扩展块中声明仅初始化访问器。
  • CS9305不能对扩展块的未命名接收方参数使用修饰符。
  • CS9306类型和别名不能命名为“extension”。
  • CS9309不允许在扩展成员语法中的嵌套位置使用扩展成员语法。
  • CS9316不允许将扩展成员作为“”nameof参数。
  • CS9317一元运算符的参数必须是扩展类型。
  • CS9318++ 或 -- 运算符的参数类型必须是扩展类型。
  • CS9319二进制运算符的参数之一必须是扩展类型。
  • CS9320重载移位运算符的第一个操作数必须与增强类型具有相同的类型。
  • CS9321扩展静态类的扩展块不能包含用户定义的运算符。
  • CS9322除非包含扩展块接收器参数是“”ref参数,否则无法为结构声明实例运算符。
  • CS9323无法为未知是否为结构或类的类型声明实例扩展运算符。
  • CS9326name:扩展成员名称不能与其扩展类型相同。
  • CS9329此扩展块与其他扩展块相冲突。它们会导致元数据中基于内容的类型名称冲突。
  • CS9339扩展解析在以下成员之间不明确。

这些错误特定于扩展块(C# 14 功能)。 扩展块是使用 extension 静态类中的上下文关键字声明的。 有关详细信息,请参阅 扩展方法

若要正确声明扩展块,请遵循以下要求:

  • 不要在扩展声明中包括名称令牌(CS9281)。 扩展程序仅声明接收器。
  • 不要为接收方参数(CS9284常见错误中涵盖)提供默认值。
  • 不要将 extension 关键字用于类型或别名(CS9306)。 这只是用于扩展块的上下文关键字。

若要正确声明扩展块中的扩展成员,除了 常见规则之外,还遵循以下要求:

  • 仅包括作为扩展成员的方法或属性(CS9282)。 不支持其他成员类型。
  • 为接收方提供一个参数名称,以包含实例扩展成员(CS9303)。
  • 确保接收器参数名称在扩展块中是唯一的,并且不会与类型参数(CS9287、CS9288CS9289CS9290CS9291、CS9292CS9294)冲突。
  • 引用扩展类型(CS9295)中在扩展上声明的所有类型参数。 可以在各个成员上添加其他类型参数。
  • 不要在其他扩展块(CS9309)内嵌套扩展块。
  • 仅在接收器参数上将 ref 修饰符用于值类型或约束为结构的泛型类型(CS9300)。
  • 仅对接收方参数使用具体(非泛型)值类型的修饰符inref readonlyCS9301)。
  • 不要对未命名接收器参数使用修饰符(CS9305)。
  • 不要在扩展块(protected)中声明成员。 扩展成员必须在扩展所在的作用域内是可访问的。
  • 不要在扩展块 init 中声明仅限 的访问器。 请改用常规属性设置器。
  • 不要将扩展成员用作 nameof 运算符的参数(CS9316)。
  • 选择与扩展类型名称不同的成员名称(CS9326)。
  • 确保扩展块在元数据中具有唯一的基于内容的类型名称(CS9329)。 合并或区分扩展块以避免冲突。
  • 通过提供更具体的类型信息或使用限定名称(CS9339)来解决不明确的扩展成员调用。

扩展块运算符要求

扩展块支持具有特定要求的用户定义运算符:

  • 一元运算符必须具有扩展类型作为其参数(CS9317)。
  • 递增 (++) 和递减 (--) 运算符必须具有扩展类型作为其参数 (CS9318)。
  • 二进制运算符必须至少有一个参数是扩展类型(CS9319)。
  • Shift 运算符必须具有扩展类型作为其第一个操作数(CS9320)。
  • 不要在扩展静态类(CS9321)的扩展块中声明用户定义的运算符。
  • 使用实例运算符扩展结构时,对接收方参数(ref使用修饰符。
  • 不要为未约束为结构或类(CS9323)的类型声明实例运算符。
  • CS1100方法具有参数修饰符“this”,该修饰符不在第一个参数上
  • CS1101参数修饰符“”ref不能与“”this一起使用。
  • CS1105扩展方法必须是静态的。
  • CS1110无法定义新扩展,因为找不到编译器所需的类型 ExtensionAttribute 。是否缺少对 System.Core.dll的引用?
  • CS1112请勿使用“ExtensionAttribute”。请改用“this”关键字。

这些错误特定于通过向第一个参数添加 this 修饰符来声明接收方的扩展方法。 有关详细信息,请参阅 扩展方法

若要正确声明 this 参数扩展方法,除了 常见规则之外,还遵循以下要求:

  • static 修饰符添加到方法(CS1105)。
  • 仅将 this 参数修饰符应用于第一个参数(CS1100)。
  • 不要将 ref 修饰符与 this 修饰符(CS1101)合并。 若要使用 ref,请转换为扩展块。
  • 在 .NET Framework 应用中添加对 System.Core.dll 的引用(CS1110)。
  • this 第一个参数使用修饰符,而不是直接应用 ExtensionAttribute 属性(CS1112)。