繁体   English   中英

关键字“参数”到底如何工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM