簡體   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