我在C#中尝试使用ValueTuple类,我对属性命名有疑问,让我们看看:
如果实例化一个ValueTuple,声明这样的对象:let foo (x: int) (y: int) =
let aux1 (z:int) = z * 2
in aux1 x +
let aux2 (q: int) = q * 3
in aux2 y;;
我们可以命名属性,
但是,像这样:var tuple1 = (Name: "Name1", Age: 25);
我们收到一条警告,说明名字会被忽略,所以
我们应该输入:ValueTuple<string,int> tuple2 = (Name: "Name1", Age: 25);
然后,属性将为ValueTuple<string,int> tuple2 = ("Name1",25);
和tuple2.Item1
有人能解释这个新手的原因吗?
比你更有优势
答案 0 :(得分:16)
有两种不同的&#34;种类&#34;这里涉及的元组:.NET MyClass.Id
类型和C#元组类型。 C#元组类型可以有元素名称; ValueTuple<...>
类型无法使用。 (在类型系统中没有任何地方可以以正常方式生活。)
在执行时,值只能识别其.NET类型。例如,如果您使用:
ValueTuple<...>
然后(string x, int y) tuple1 = ("hello", 10);
(string a, int b) tuple2 = ("hello", 10);
DoSomethingWithValue(tuple1);
DoSomethingWithValue(tuple2);
...
void DoSomethingWithValue(object value) { ... }
根本无法区分两个元组值。该信息仅在编译时提供。
有关参数和返回类型之类的元素名称的信息通过C#编译器使用的属性传播。例如,一个声明如下的方法:
DoSomethingWithValue
在IL中编译,好像它已被声明为:
public (string name, int score) GetFoo()
C#语言定义.NET类型和C#元组类型之间的适当转换,以使其尽可能无缝。
就如何使用元组而言,我尽可能使用C#元组类型。命名元组元素会对可用性产生巨大影响。
答案 1 :(得分:0)
您想要定义的是
(string Name,int Age) tuple1 = (Name: "Name1", Age: 25);
你要定义的是
ValueTuple<string,int> tuple2 = (Name: "Name1", Age: 25);
查看您正在定义的类型之间的区别。如果你拿这个名字,两者都是两回事。
答案 2 :(得分:-1)
简而言之:不,你不能用这样的命名字段创建ValueTuples。
详细信息:请查看Name ValueTuple properties when creating with new - 您的问题在那里得到了很好的回答。