我知道我可以在隐式创建元组时命名参数,例如:
var me = (age: 21, favoriteFood: "Custard");
是否可以在显式创建元组时命名参数?即
var me = new ValueTuple<int, string>(21, "Custard");
最佳答案
不,你不能。 ValueTuple
类型实际上独立于 C# 中的命名字段支持。后者更像是匿名类型的命名属性。也就是说,编译器分析代码并根据您的声明和用法为适当的成员生成别名。编译器通过赋值来学习字段的名称。由于基本构造函数语法不提供命名字段的机制,因此您不能使用它直接生成具有命名字段的元组。
当然,您可以通过多种方式重新解释从构造函数语法返回的值,为该返回值指定名称。我假设您知道这种方法并且正在寻找更直接的方法。
作为我所说的“重新解释”的例子,你可以这样做:
static (int value, string text) ConvertToNamed((int, string) t) => 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
等时名称是一等公民。
关于c# - 使用 new 创建时命名 ValueTuple 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43565738/