这里涉及两种不同“类型”的元组:.NETValueTuple<...>
类型和 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# 元组类型。命名元组元素在可用性上有很大的不同。