這裏涉及的元組的兩個不同的「種」:在.NET ValueTuple<...>
類型和C#的元組類型。 C#元組類型可以有元素名稱; ValueTuple<...>
類型不能。 (在類型系統中根本就沒有任何地方可以正常生活)
在執行時,一個值只知道它的.NET類型。例如,如果你使用:
(string x, int y) tuple1 = ("hello", 10);
(string a, int b) tuple2 = ("hello", 10);
DoSomethingWithValue(tuple1);
DoSomethingWithValue(tuple2);
...
void DoSomethingWithValue(object value) { ... }
然後DoSomethingWithValue
將不能夠在所有的二元組值來區分。該信息僅在編譯時可用。
有關參數和返回類型等元素名稱的信息將通過C#編譯器使用的屬性傳播。因此,例如,一個方法聲明如下:
public (string name, int score) GetFoo()
在IL被編譯,如果它已被宣佈這樣的:
[TupleElementNames(new string[] { "name", "score" }]
public ValueTuple<string, int> GetFoo()
C#語言定義.NET類型和之間的適當的轉換C#元組類型使其儘可能無縫。
就如何使用元組而言,儘可能使用C#元組類型。命名元組元素在可用性方面有很大的不同。
'ValueTuple'只是一個普通的C#類型,沒有編譯器的特別支持。它的成員總是被稱爲'Item1','Item2'等等。然而,'(x,y)'元組語法在編譯器的特別支持下爲元組成員引入了其他名稱,並將它們映射到生成的IL代碼中適當的'ValueType'名稱。 –
「但是,像這樣:'ValueTuple tuple2 =(Name:」Name1「,Age:25);' 我們收到一個錯誤」 - 不,而不是你已經顯示的代碼。您會收到警告,指出元組文字中的名稱被有效忽略,但您不會收到錯誤。 –