我知道我可以在创建一个隐式的元组时命名参数:
var me = (age: 21, favoriteFood: "Custard");
是否可以在明确创建元组时命名参数?即。
var me = new ValueTuple<int, string>(21, "Custard");
答案 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);
变量t1
与Item1
和Item2
相关联。但编译器将隐式生成变量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中,您将得到警告,警告每个项目 名称将被忽略。
我之所以发布此答案,是因为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;