[英]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.Item1
和tuple2.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.