当我写这行时:
Tuple<string,string> key = (controller, action);
我收到此错误:
严重级代码描述项目文件行抑制状态 错误CS0029无法隐式转换类型'(字符串控制器, string action)'to'System.Tuple'Project.Web PageMetadata.cs 27 Active
这似乎是对C#7更新核心的新元组增强功能的一种相当直接,直观的应用,但它不起作用。我做错了什么?
答案 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);
但是如果你这样做,你仍然会得到两个被称为Item1
和Item2
的元素,这会破坏新元组语法的一个关键特性:命名元素。将其更改为使用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
(由元组语法使用),或者返回,则有一些扩展方法:ToTuple
和ToValueTuple
定义为小arities。