与方法参数上的 params 修饰符相关的错误和警告

lock 语句和线程同步相关的一些错误:

  • CS0225:params 参数必须是一维数组或具有有效的集合类型
  • CS0231:params 参数必须是形参列表中的最后一个参数
  • CS0466:由于“method2”没有 params 参数,因此“method1”也不应当有该参数
  • CS0674:请勿使用 System.ParamArrayAttributeSystem.ParamArrayAttribute/System.Runtime.CompilerServices.ParamCollectionAttribute请改用 params 关键字。
  • CS0758:两种分部方法声明必须要么都使用 params 参数,要么都不使用 params 参数
  • CS1104:参数数组不能与 this 修饰符一起在扩展方法中使用。
  • CS1611:params 参数不能声明为 in refout
  • CS1670:params 在此上下文中无效
  • CS1751:无法为参数数组指定默认值。
  • CS9218:由于使用了具有动态类型的实参,并且该方法具有非数组 params 集合形参,因此无法从用法中推断出方法的类型参数。请尝试显式指定类型参数。
  • CS9223:创建 params 集合会导致构造函数的无限调用链。
  • CS9224:方法的可见性不能低于具有 params 集合的成员。
  • CS9225:构造函数未初始化所需的成员。
  • CS9227:类型不包含适当实例 Add 方法的定义。
  • CS9228:非数组 params 集合类型必须具有可以不带参数调用的适用构造函数。

方法声明规则

以下错误表明在参数上使用 params 修饰符,而该上下文中不允许使用 params 修饰符:

  • CS0231:params 参数必须是形参列表中的最后一个参数。
  • CS1104:参数数组不能与 this 修饰符一起在扩展方法中使用
  • CS1611:params 参数不能声明为 in refout
  • CS1670:params 在此上下文中无效
  • CS1751:无法为参数数组指定默认值。

编译器对在方法参数上使用 params 修饰符强制执行以下规则:

  • params 修饰符仅可用于形参列表中的最后一个参数。 这包括具有默认值的任何参数。
  • 使用 params 修饰符时,不能包含形参的默认实参。
  • params 修饰符不能应用于引用参数。 引用参数是具有 inref readonlyrefout 修饰符的参数。
  • 不能在扩展方法上组合 params 修饰符和 this 修饰符。
  • params 修饰符不能用于重载运算符。

在 C# 12 之前的版本中,params 修饰符不能用于匿名方法或 lambda 表达式的参数。

形参和实参类型规则

以下错误指示用于 params 的参数类型无效:

  • CS9218:由于使用了具有动态类型的实参,并且该方法具有非数组 params 集合形参,因此无法从用法中推断出方法的类型参数。请尝试显式指定类型参数。
  • CS0225:params 参数必须是一维数组或具有有效的集合类型
  • CS9227:类型不包含适当实例 Add 方法的定义
  • CS9228:非数组 params 集合类型必须具有可以不带参数调用的适用构造函数。

在 C# 13 之前的版本中,params 修饰符仅适用于一维数组。 其他类型均无效。

从 C# 13 开始,可以使用任何有效的集合类型。 但是,仍存在一些限制。 集合类型必须遵循与集合表达式的目标相同的规则。

其他 params 错误

以下错误指示使用 params 修饰符的其他问题:

  • CS0466:由于“method2”没有 params 参数,因此“method1”也不应当有该参数
  • CS0674:请勿使用 System.ParamArrayAttributeSystem.Runtime.CompilerServices.ParamCollectionAttribute请改用 params 关键字。
  • CS0758:两种分部方法声明必须要么都使用 params 参数,要么都不使用 params 参数
  • CS9223:创建 params 集合会导致构造函数的无限调用链。
  • CS9224:方法的可见性不能低于具有 params 集合的成员。
  • CS9225:构造函数未初始化所需的成员。

当且仅当接口成员具有 params 修饰符时,实现接口的方法才必须包含 params 修饰符。 同样,partial 方法的两个声明要么都必须包含 params 修饰符,要么都不得包含 params 修饰符。

必须使用 params 修饰符。 不能应用等效属性 System.ParamArrayAttributeSystem.Runtime.CompilerServices.ParamCollectionAttribute

当生成的用于创建集合类型的代码无效时,编译器会生成上述列表中的最后三个错误之一:

  • 当发出的用于创建集合的代码还包含相同类型的 params 集合时,编译器会发出 CS9223。 通常,Add 方法采用同一类型的 params 集合。
  • 当集合类型的 Create 方法的可访问性低于采用集合类型的 params 参数的方法时,编译器会发出 CS9224
  • 当集合类型具有必需的成员,而无参数构造函数未初始化该成员,且无参数构造函数上有 System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute 时,编译器会发出 CS9225

另请参阅