我正在尝试ValueTuple类在C#中,我对属性命名有一个疑问,让我们看看:
如果实例化一个声明对象的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
有人能解释一下这个新手的原因吗?
比你占优势
发布于 2017-10-06 09:03:45
这里涉及两种不同的元组:.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#元组类型。命名元组元素会在可用性方面产生巨大的差异。
发布于 2017-10-06 08:45:54
你想要定义的是
(string Name,int Age) tuple1 = (Name: "Name1", Age: 25);你定义的是
ValueTuple<string,int> tuple2 = (Name: "Name1", Age: 25);看看您正在定义的in之间的区别。如果你取名字的话,两者都是两种不同的东西。
发布于 2017-10-06 08:45:21
简而言之:不,不能用这样的命名字段创建ValueTuples。
细节:看看Name ValueTuple properties when creating with new --你的问题在这里得到了很好的回答。
https://stackoverflow.com/questions/46601631
复制相似问题