使用new创建名称ValueTuple属性

Ban*_*San 19 .net c# c#-7.0

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

var me = (age: 21, favoriteFood: "Custard");
Run Code Online (Sandbox Code Playgroud)

是否可以在显式创建元组时命名参数?即

var me = new ValueTuple<int, string>(21, "Custard");
Run Code Online (Sandbox Code Playgroud)

Pet*_*iho 26

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

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

作为我所说的"重新解释"的一个例子,你可以这样做:

static (int value, string text) ConvertToNamed((int value, string text) t)
{
    return t;
}
Run Code Online (Sandbox Code Playgroud)

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

var t1 = new ValueTuple<int, string>(21, "hello");
var t2 = ConvertToNamed(t1);
Run Code Online (Sandbox Code Playgroud)

该变量t1Item1和卡在一起Item2.但编译器将隐式生成变量的所需名称t2.

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

(int value, string text) t = new ValueTuple<int, string>(21, "hello");
Run Code Online (Sandbox Code Playgroud)

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

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

  • 有什么理由为什么这个方法是`(int value,string text)ConvertToNamed((int value,string text)t)`而不仅仅是`(int value,string text)ConvertToNamed((int,string)t)`? (3认同)