首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# ValueTuple属性命名

C# ValueTuple属性命名
EN

Stack Overflow用户
提问于 2017-10-06 08:35:09
回答 3查看 7.4K关注 0票数 10

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

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

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

我们收到警告说名字被忽略了,所以

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

那么这些属性将是tuple2.Item1tuple2.Item2

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

比你占优势

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-06 09:03:45

这里涉及两种不同的元组:.NET ValueTuple<...>类型和C#元组类型。C#元组类型可以有元素名,而ValueTuple<...>类型不能。(类型系统中没有任何地方可以正常地使用)。

在执行时,值只知道其.NET类型。例如,如果您使用:

代码语言:javascript
复制
(string x, int y) tuple1 = ("hello", 10);
(string a, int b) tuple2 = ("hello", 10);
DoSomethingWithValue(tuple1);
DoSomethingWithValue(tuple2);
...
void DoSomethingWithValue(object value) { ... }

这样,DoSomethingWithValue就根本无法区分这两个元组值。这些信息只有在编译时才能获得.

有关诸如参数和返回类型的元素名称的信息是通过C#编译器使用的属性传播的。例如,一个声明如下的方法:

代码语言:javascript
复制
public (string name, int score) GetFoo()

在IL中编译,就好像它是这样声明的:

代码语言:javascript
复制
[TupleElementNames(new string[] { "name", "score" }]
public ValueTuple<string, int> GetFoo()

C#语言定义了.NET类型和C#元组类型之间的适当转换,以使其尽可能无缝。

关于如何使用元组,我会尽可能地使用C#元组类型。命名元组元素会在可用性方面产生巨大的差异。

票数 22
EN

Stack Overflow用户

发布于 2017-10-06 08:45:54

你想要定义的是

代码语言:javascript
复制
(string Name,int Age) tuple1 = (Name: "Name1", Age: 25);

你定义的是

代码语言:javascript
复制
ValueTuple<string,int> tuple2 = (Name: "Name1", Age: 25);

看看您正在定义的in之间的区别。如果你取名字的话,两者都是两种不同的东西。

票数 2
EN

Stack Overflow用户

发布于 2017-10-06 08:45:21

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

细节:看看Name ValueTuple properties when creating with new --你的问题在这里得到了很好的回答。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46601631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档