c# - 使用 new 创建时命名 ValueTuple 属性

标签 c# .net c#-7.0

我知道我可以在隐式创建元组时命名参数,例如:

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);

变量 t1Item1Item2 卡在一起。但是编译器会隐式地为变量 t2 生成所需的名称。

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

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

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

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

关于c# - 使用 new 创建时命名 ValueTuple 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43565738/

相关文章:

c# - 使用 TransactionScope RequiresNew 的缺点

c# - 从 html 文档中获取跨度值

c# - C# 中的 SVN 框架

c# - DataGrid 使用 AutoGenerateColumns=true 启用列的文本换行

c# - 调试作为 VS 解决方案的一部分运行的 NuGet

c# - 我可以用这种方式为所有派生的单例定义一个抽象类吗?

c# - 为什么我可以返回对局部变量字段的引用

c# - 将 expression-bodied 与 throw 混合用于多个参数

c# - 使用 C# 7.0 的新 TaskLike 异步支持是否可以编写 IObservable<T> 生成器

c# - ServiceStack.Ormlite.MySql SqlJoinBuilder 无效转换异常