在方法声明中的 params 关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params 关键字。
params 参数的声明类型必须是集合类型。识别的集合类型包括:
- 一维数组类型 T[ ],在这种情况下,元素类型为 T。
- span 类型:
** System . Span < T >
** System . ReadOnlySpan < T >
** 此处,元素类型为 T。 - 具有具有相应元素类型的可访问 create 方法的类型。使用用于集合表达式的相同属性来标识 create 方法。
- 实现 System . Collections . Generic . IEnumerable < T > 的结构体或类类型,其中:
** 该类型有一个可以不带参数调用的构造函数,并且该构造函数至少与声明成员一样可访问。
** 该类型有一个实例(不是扩展)方法 Add,其中:
** 可以用单个值参数调用该方法。
** 如果方法是泛型的,则可以从参数推断出类型参数。
** 该方法至少与声明成员具有同样的可访问性。这里,元素类型是类型的迭代类型。 - 接口类型:
** System . Collections . Generic . IEnumerable < T >
** System . Collections . Generic . IReadOnlyCollection < T >
** System . Collections . Generic . IReadOnlyList < T >
** System . Collections . Generic . ICollection < T >
** System . Collections . Generic . IList < T > 这里的元素类型是 T。
在 C# 13 之前,参数必须是一维数组。
使用 params 参数调用方法时,可以传入:
- 数组元素类型的参数的逗号分隔列表。
- 指定类型的参数的集合。
- 无参数。如果未发送任何参数,则 params 列表的长度为零。
下面的示例演示可向 params 形参发送实参的各种方法。
static void Main(string[] args)
{
// 可以发送指定类型的以逗号分隔的参数列表
FFparams修饰符 ( 1 , 2 , 3 , 4 , 5 );
FFparams修饰符 ( 1 , "C#" , 'F' );
// params 参数接受零个或多个参数
// 下面的调用语句只显示空行
FFparams修饰符int ( );
FFparams修饰符object ( );
// 只要数组类型与被调用方法的参数类型匹配,就可以传递数组参数
int [ ] Zhss = [5 , 6 , 7 , 8 , 9 , 10 , 11];
FFparams修饰符 ( Zhss );
FFparams修饰符int ( Zhss );
object [ ] Dxs = [ 'T' , "再一次" , 2.5 , 1E15 ];
FFparams修饰符 ( Dxs );
FFparams修饰符object( Dxs );
// 下面的调用会导致编译器错误,因为无法将对象数组转换为整数数组
// FFparams修饰符int ( Dxs ); // 警告 CS1503:参数 1:无法从“object [ ]”转换为“int”
// 下面的调用不会导致错误,但整个 int 数组将成为 params 数组的第一个元素
FFparams修饰符object ( Zhss );
}
/// <summary>
/// 参数是 int 列表
/// </summary>
/// <param name="LB">int [ ] 列表</param>
public static void FFparams修饰符 ( params int [ ] LB )
{
for ( int i = 0 ; i < LB . Length ; i++ )
{
Console . Write ( $"{LB[ i ]:G} " );
}
Console . WriteLine ( );
}
/// <summary>
/// 参数是 object 列表
/// </summary>
/// <param name="LB">object [ ] 列表</param>
public static void FFparams修饰符 ( params object [ ] LB )
{
for ( int i = 0 ; i < LB . Length ; i++ )
{
Console . Write ( $"{LB [ i ]} " );
}
Console . WriteLine ( );
}
public static void FFparams修饰符object ( params object [ ] LB )
{
for ( int i = 0 ; i < LB . Length ; i++ )
{
Console . Write ( $"{LB [ i ]} " );
}
Console . WriteLine ( );
}
public static void FFparams修饰符int ( params int [ ] LB )
{
for ( int i = 0 ; i < LB . Length ; i++ )
{
Console . Write ( $"{LB [ i ]:G} " );
}
Console . WriteLine ( );
}
当 params 形参的实参是集合类型时,重载解析可能导致歧义。实参的集合类型必须可转换为形参的集合类型。当不同的重载为该参数提供更好的转换时,该方法可能更好。但是,如果 params 参数的参数是离散元素或缺少元素,则对于该参数,具有不同 params 参数类型的所有重载都是相等的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。