本文介绍以下编译器错误:
-
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: 参数、局部变量或本地函数不能与扩展参数同名。
-
CS9291: “
value:自动生成的参数名称与扩展参数名称冲突。 - CS9292: 类型参数的名称与扩展参数相同。
- CS9293: 不能在此上下文中使用扩展参数。
-
CS9294: “
value:自动生成的参数名称与扩展类型参数名称冲突。 - CS9295: 扩展类型必须引用扩展声明的所有类型参数,但不引用类型参数。
-
CS9300: 扩展块的“”
ref接收方参数必须是值类型或受结构约束的泛型类型。 -
CS9301: 扩展的“”
in或“”ref readonly接收方参数必须是具体的(非泛型)值类型。 - CS9302: 扩展块中声明的新受保护成员。
- CS9303: 无法使用未命名接收器参数在扩展块中声明实例成员。
- CS9304: 无法在扩展块中声明仅初始化访问器。
- CS9305: 不能对扩展块的未命名接收方参数使用修饰符。
- CS9306: 类型和别名不能命名为“extension”。
- CS9309: 不允许在扩展成员语法中的嵌套位置使用扩展成员语法。
-
CS9316: 不允许将扩展成员作为“”
nameof参数。 - CS9317: 一元运算符的参数必须是扩展类型。
- CS9318: ++ 或 -- 运算符的参数类型必须是扩展类型。
- CS9319: 二进制运算符的参数之一必须是扩展类型。
- CS9320: 重载移位运算符的第一个操作数必须与扩展类型具有相同的类型。
- CS9321: 扩展静态类的扩展块不能包含用户定义的运算符。
-
CS9322: 除非包含扩展块接收器参数是“”
ref参数,否则无法为结构声明实例运算符。 - CS9323: 无法为一种未知是否为结构或类的类型声明实例扩展运算符。
-
CS9326: “
name:扩展成员名称不能与其扩展类型相同。 - CS9329: 此扩展块与其他扩展块相冲突。它们会导致元数据中基于内容的类型名称冲突。
- CS9339: 扩展解析在以下成员之间不明确。
扩展声明的常见错误
-
CS1102: 参数修饰符“”
out不能与“”this一起使用。 - CS1103: 扩展方法的第一个参数不能是指针类型。
- CS1106: 扩展方法必须在非泛型静态类中定义。
- CS1109: 扩展方法必须在顶级静态类上定义,“name”是嵌套类。
- CS1113: 不能使用对值类型定义的扩展方法来创建委托。
- CS1743: 无法为“this”参数指定默认值。
- CS9283: 必须在顶级非泛型静态类中声明扩展。
- CS9284: 扩展的接收方参数不能有默认值。
- CS9285: 扩展容器只能有一个接收方参数。
当你违反适用于所有扩展成员声明的规则时,编译器会发出这些错误,而不管选择哪种语法。 有关详细信息,请参阅 扩展方法。
若要正确声明扩展成员,请遵循以下要求:
- 将包含类型声明为非泛型
static类或结构(CS1106、 CS9283)。 - 在顶层声明包含的类型,而不是将其嵌套在另一类型中(CS1109,CS9283)。
- 不要将值类型的扩展方法转换为委托(CS1113)。 请改为创建常规方法。
- 不要在
out接收方参数上使用参数修饰符(CS1102)。 - 不要为接收方参数(CS1743、 CS9284)提供默认值。
- 不要扩展指针类型(CS1103)。 将修饰符应用到
this的参数不能是指针类型。 - 每个扩展容器(CS9285)只声明一个接收方参数。
与扩展块声明相关的错误
- CS9281: 扩展声明可能没有名称。
- CS9282: 扩展声明只能包含方法或属性。
- CS9287: 接收方参数不能与扩展容器类型参数同名。
- CS9288: 参数、局部变量或本地函数不能与扩展容器类型参数同名。
- CS9289: 成员类型参数的名称与扩展容器类型参数相同。
- CS9290: 参数、局部变量或本地函数不能与扩展参数同名。
-
CS9291: “
value:自动生成的参数名称与扩展参数名称冲突。 - CS9292: 类型参数的名称与扩展参数相同。
- CS9293: 不能在此上下文中使用扩展参数。
-
CS9294: “
value:自动生成的参数名称与扩展类型参数名称冲突。 - CS9295: 扩展类型必须引用扩展声明的所有类型参数,但不引用类型参数。
-
CS9300: 扩展块的“”
ref接收方参数必须是值类型或受结构约束的泛型类型。 -
CS9301: 扩展的“”
in或“”ref readonly接收方参数必须是具体的(非泛型)值类型。 - CS9302: 扩展块中声明的新受保护成员。
- CS9303: 无法使用未命名接收器参数在扩展块中声明实例成员。
- CS9304: 无法在扩展块中声明仅初始化访问器。
- CS9305: 不能对扩展块的未命名接收方参数使用修饰符。
- CS9306: 类型和别名不能命名为“extension”。
- CS9309: 不允许在扩展成员语法中的嵌套位置使用扩展成员语法。
-
CS9316: 不允许将扩展成员作为“”
nameof参数。 - CS9317: 一元运算符的参数必须是扩展类型。
- CS9318: ++ 或 -- 运算符的参数类型必须是扩展类型。
- CS9319: 二进制运算符的参数之一必须是扩展类型。
- CS9320: 重载移位运算符的第一个操作数必须与增强类型具有相同的类型。
- CS9321: 扩展静态类的扩展块不能包含用户定义的运算符。
-
CS9322: 除非包含扩展块接收器参数是“”
ref参数,否则无法为结构声明实例运算符。 - CS9323:无法为未知是否为结构或类的类型声明实例扩展运算符。
-
CS9326: “
name:扩展成员名称不能与其扩展类型相同。 - CS9329: 此扩展块与其他扩展块相冲突。它们会导致元数据中基于内容的类型名称冲突。
- CS9339: 扩展解析在以下成员之间不明确。
这些错误特定于扩展块(C# 14 功能)。 扩展块是使用 extension 静态类中的上下文关键字声明的。 有关详细信息,请参阅 扩展方法。
若要正确声明扩展块,请遵循以下要求:
- 不要在扩展声明中包括名称令牌(CS9281)。 扩展程序仅声明接收器。
- 不要为接收方参数(CS9284( 常见错误中涵盖)提供默认值。
- 不要将
extension关键字用于类型或别名(CS9306)。 这只是用于扩展块的上下文关键字。
若要正确声明扩展块中的扩展成员,除了 常见规则之外,还遵循以下要求:
- 仅包括作为扩展成员的方法或属性(CS9282)。 不支持其他成员类型。
- 为接收方提供一个参数名称,以包含实例扩展成员(CS9303)。
- 确保接收器参数名称在扩展块中是唯一的,并且不会与类型参数(CS9287、CS9288、CS9289、CS9290、CS9291、CS9292、CS9294)冲突。
- 引用扩展类型(CS9295)中在扩展上声明的所有类型参数。 可以在各个成员上添加其他类型参数。
- 不要在其他扩展块(CS9309)内嵌套扩展块。
- 仅在接收器参数上将
ref修饰符用于值类型或约束为结构的泛型类型(CS9300)。 - 仅对接收方参数使用具体(非泛型)值类型的修饰符
in或ref readonly(CS9301)。 - 不要对未命名接收器参数使用修饰符(CS9305)。
- 不要在扩展块(
protected)中声明成员。 扩展成员必须在扩展所在的作用域内是可访问的。 - 不要在扩展块
init中声明仅限 的访问器。 请改用常规属性设置器。 - 不要将扩展成员用作
nameof运算符的参数(CS9316)。 - 选择与扩展类型名称不同的成员名称(CS9326)。
- 确保扩展块在元数据中具有唯一的基于内容的类型名称(CS9329)。 合并或区分扩展块以避免冲突。
- 通过提供更具体的类型信息或使用限定名称(CS9339)来解决不明确的扩展成员调用。
扩展块运算符要求
扩展块支持具有特定要求的用户定义运算符:
- 一元运算符必须具有扩展类型作为其参数(CS9317)。
- 递增 (
++) 和递减 (--) 运算符必须具有扩展类型作为其参数 (CS9318)。 - 二进制运算符必须至少有一个参数是扩展类型(CS9319)。
- Shift 运算符必须具有扩展类型作为其第一个操作数(CS9320)。
- 不要在扩展静态类(CS9321)的扩展块中声明用户定义的运算符。
- 使用实例运算符扩展结构时,对接收方参数(
ref使用修饰符。 - 不要为未约束为结构或类(CS9323)的类型声明实例运算符。
与 this 参数扩展方法相关的错误
-
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)。