关键字'params'究竟是如何工作的?

Pra*_*ter 6 c# compiler-construction generics parameters

以下代码示例打印:

T
T[]
T[]
Run Code Online (Sandbox Code Playgroud)

虽然前两行是预期的,为什么编译器为常规数组选择了param数组?

public class A
{
    public void Print<T>(T t)
    {
        Console.WriteLine("T");
    }

    public void Print<T>(params T[] t)
    {
        Console.WriteLine("T[]");
    }
}

class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        a.Print("string");
        a.Print("string","string");
        a.Print(new string[] {"a","b"});
    }
}
Run Code Online (Sandbox Code Playgroud)

aru*_*rul 10

在引擎盖下

a.Print("string","string");
Run Code Online (Sandbox Code Playgroud)

只是语法糖

a.Print(new string[]{"string","string"});
Run Code Online (Sandbox Code Playgroud)

编辑:就像我说的,params关键字只为你自动创建数组,你告诉编译器:要么T直接接受数组,要么使用X输入参数来构造该数组.


Dus*_*ell 5

除了其他人所说的,params关键字还会导致ParamArrayAttribute为生成的数组参数.所以这...

public void Print<T>(params T[] t) { }
Run Code Online (Sandbox Code Playgroud)

由编译器生成为...

public void Print<T>([ParamArray] T[] t); { }
Run Code Online (Sandbox Code Playgroud)

正是该属性向编译器和IDE指示可以使用更简单的语法调用该方法...

a.Print("string", "string");
Run Code Online (Sandbox Code Playgroud)

而不是...

a.Print(new string[] { "string", "string" });
Run Code Online (Sandbox Code Playgroud)