[英]How exactly keyword 'params' work?
以下代码样本打印:
T
T[]
T[]
尽管前两行符合预期,但为什么编译器选择常规数组的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"});
}
}
引擎盖下
a.Print("string","string");
只是语法糖
a.Print(new string[]{"string","string"});
编辑:就像我说的那样, params
关键字只会自动为您创建数组,您告诉编译器:要么直接接受T
的数组,要么使用X输入params构造该数组。
除了其他人所说的之外, params关键字还会使ParamArrayAttribute生成为for数组参数。 所以这...
public void Print<T>(params T[] t) { }
由编译器生成为...
public void Print<T>([ParamArray] T[] t); { }
该属性向编译器和IDE指示可以使用更简单的语法来调用该方法...
a.Print("string", "string");
而不是...
a.Print(new string[] { "string", "string" });
参数使您可以传递相同类型的多个对象。 这是传递数组的快捷方式
我认为这实际上与类型推断有关,而不是与params关键字有关。 推理引擎在第三行假定T的类型为string [],因此将其传递给第一个方法。
如果您不相信我,请尝试Console.WriteLine(typeof(T))
当具有params关键字时,编译器将对形式函数声明以及实际函数调用进行一些翻译。
形式函数声明:
在幕后,IL将被翻译为与
public void Print<T>(T[] array);
will be checked for syntax translation. 除了编译时,将检查以进行语法转换。 含义,
a.Print("string1", "string2");
成为与IL相同的IL代码
a.Print(new string[]{"string1", "string2"});
这就是第2行和第3行具有相同输出的原因,因为在幕后,它们被转换为完全相同的IL。
有关为什么第3行不打印“ T”的问题是因为.NET编译器将始终尝试查找最佳的重载匹配,因此第2行和第3行都调用了T []版本而不是普通T。
就像阿鲁尔所说的那样。 如果在反射器中打开项目,则会看到以下内容:
a.Print<string>(new string[] { "string", "string" });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.