C#ValueTuple属性命名

时间:2017-10-06 08:35:09

标签: c# c#-7.0 valuetuple

我在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

有人能解释这个新手的原因吗?

比你更有优势

3 个答案:

答案 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 - 您的问题在那里得到了很好的回答。