繁体   English   中英

C#ValueTuple属性命名

[英]C# ValueTuple properties naming

我在C#中尝试使用ValueTuple类,我对属性命名有疑问,让我们看看:

如果实例化一个ValueTuple声明这样的对象: var tuple1 = (Name: "Name1", Age: 25); 我们可以命名属性,

但是,像这样: ValueTuple<string,int> tuple2 = (Name: "Name1", Age: 25);

我们得到一个警告,说明名字被忽略了,所以

我们应该输入: ValueTuple<string,int> tuple2 = ("Name1",25);

然后属性将是tuple2.Item1tuple2.Item2

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

比你有利

这里涉及两种不同的“元组”元组:.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#元组类型。 命名元组元素会对可用性产生巨大影响。

你想要定义的是

(string Name,int Age) tuple1 = (Name: "Name1", Age: 25);

你所定义的是

ValueTuple<string,int> tuple2 = (Name: "Name1", Age: 25);

看看你定义的Type之间的区别。 如果你拿这个名字,两者都是两回事。

简而言之:不,你不能用这样的命名字段创建ValueTuples。

详细信息:在使用new创建时 ,请查看Name ValueTuple属性 - 您的问题在那里得到了很好的回答。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM