使用new创建名称ValueTuple属性

时间:2017-04-22 23:30:14

标签: c# .net c#-7.0

我知道我可以在创建一个隐式的元组时命名参数:

var me = (age: 21, favoriteFood: "Custard");

是否可以在明确创建元组时命名参数?即。

var me = new ValueTuple<int, string>(21, "Custard");

5 个答案:

答案 0 :(得分:24)

不,你不能。 ValueTuple类型实际上独立于C#中的命名字段支持。后者更像是匿名类型的命名属性。也就是说,编译器会根据您的声明和用法分析代码并为相应的成员生成别名。通过赋值,编译器将学习字段的名称。由于基本构造函数语法没有提供命名字段的机制,因此您无法使用它直接生成带有命名字段的元组。

当然,有一些方法可以重新解释从构造函数语法返回的值,为返回的值赋值。我假设你已经意识到这种方法,并且正在寻找更直接的东西。

作为我的意思的一个例子&#34;重新解释&#34;,你可以这样做:

static (int value, string text) ConvertToNamed((int value, string text) t)
{
    return t;
}

然后这将在一个新变量中命名字段:

var t1 = new ValueTuple<int, string>(21, "hello");
var t2 = ConvertToNamed(t1);

变量t1Item1Item2相关联。但编译器将隐式生成变量t2的所需名称。

也许一个更好的例子就是你不需要额外的方法:

(int value, string text) t = new ValueTuple<int, string>(21, "hello");

同样,您并没有真正命名构造函数语法中的字段,但它们会被局部变量声明重新解释。

这可能不是一个严重的限制。在希望拥有持久且易于分配的名称的情况下,声明用户定义的类型可能比使用元组语法更好。您也可以为用户定义的类型编写解构器,并且声明类似的类型意味着在涉及反射时,名称是一等公民,dynamic等。

答案 1 :(得分:0)

您可以在分配期间强制转换为已命名的元组:

var me = ((int value, string text)) new ValueTuple<int, string>(21, "Custard");

答案 2 :(得分:0)

...使用C#7.0时,无法使用自定义商品名称 显式的System.ValueTuple <…>数据类型。因此,如果您替换var 在图1的示例8中,您将得到警告,警告每个项目 名称将被忽略。

Source

我之所以发布此答案,是因为docs最接近的解释是:

ValueTuple类型的数据成员是字段。元组的数据成员 类型就是属性。

答案 3 :(得分:0)

在 Linq 中使用 ValueTuple 时正在寻找这个。我做了一个 F2-rename 变量,它创建了以下语法:

var query = from x in myList
select (First: x.something, Second: x.other) into g
select new Whatever(g.First, g.Second);

答案 4 :(得分:-3)

我不相信。以下是我在ValueTuple上找到的文档:

https://docs.microsoft.com/en-us/dotnet/api/system.valuetuple-7?view=netframework-4.7

我个人没有使用过ValueTuble类型。我之前使用过Tuple类:

var tuple = new Tuple<int, string>(21, "Custard");
var number = tuple.Item1;
var st = tuple.Item2;

然而,我发现使用元组,特别是当通过方法笨重时。始终必须知道Item1和Item2等中的内容。根据ValueTuple文档,它以相同的方式使用。

你不应该做一个实体课吗?

我使用了匿名类型,我认为它符合您的需求。

var anyom = new
{
    age = 21,
    favoriteFood = "Custard"
};

number = anyom.age;
st = anyom.favoriteFood;