C#7.0元组扣除

时间:2017-12-17 00:23:35

标签: c# tuples c#-7.0

当我写这行时:

Tuple<string,string> key = (controller, action);

我收到此错误:

  

严重级代码描述项目文件行抑制状态   错误CS0029无法隐式转换类型'(字符串控制器,   string action)'to'System.Tuple'Project.Web PageMetadata.cs 27 Active

这似乎是对C#7更新核心的新元组增强功能的一种相当直接,直观的应用,但它不起作用。我做错了什么?

4 个答案:

答案 0 :(得分:7)

新的元组功能需要ValueTuple类型,即

ValueTuple<string, string> key = (controller, action);

var key = (controller, action);

重要的是要注意Tuple是一个类,而ValueTuple是一个结构。你不应该混淆它们。有关C#7中新元组功能的更多详细信息,请参阅here

答案 1 :(得分:2)

首先,当您尝试将新样式元组(ValueTuple)强制转换为旧样式元组(Tuple)时,会出现该错误。

这可以使用ToTuple()扩展方法来实现:

Tuple<string,string> key = (controller, action).ToTuple();        

但这可能不是你想要做的。如果要创建新元组的实例,可以执行以下操作:

ValueTuple<string,string> key = (controller, action);

但是如果你这样做,你仍然会得到两个被称为Item1Item2的元素,这会破坏新元组语法的一个关键特性:命名元素。将其更改为使用var,然后您将获得命名元素:

var key = (controller, action);
Console.WriteLine(key.controller); // key.controller is now valid

如果你真的不喜欢使用var(有些人不喜欢),那么你可以通过简单的方式来表达这些命名元素:

(string controller, string action) key = (controller, action); 
Console.WriteLine(key.controller);

答案 2 :(得分:0)

使用ValueTuple<string, string>代替Tuple<string, string>Tuple<T1,T2>是C#7.0之前的系统类型; ValueTuple<T1,T2>是支持新语言功能的版本。有关详细信息,请参阅the C# Tuple type guide

答案 3 :(得分:0)

如果您确实需要从System.Tuple转换为System.ValueTuple(由元组语法使用),或者返回,则有一些扩展方法:ToTupleToValueTuple定义为小arities。