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