在方法声明中的 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 参数类型的所有重载都是相等的。


兔子码农
4 声望1 粉丝

一个酒晕子