【问题标题】:C# 7.0 Tuple DeductionC# 7.0 元组推演
【发布时间】:2018-05-30 18:35:39
【问题描述】:

当我写下这一行时:

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

我收到此错误:

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

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

【问题讨论】:

    标签: c# tuples c#-7.0


    【解决方案1】:

    首先,当您尝试将新样式元组 (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】:

      如果您确实需要从System.Tuple 转换为System.ValueTuple(由元组语法使用)或返回,可以使用扩展方法:ToTupleToValueTuple,为小型数组定义。

      【讨论】:

        【解决方案3】:

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

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

        var key = (controller, action);
        

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

        【讨论】:

          【解决方案4】:

          使用ValueTuple&lt;string, string&gt; 代替Tuple&lt;string, string&gt;Tuple&lt;T1,T2&gt; 是 C# 7.0 之前的系统类型; ValueTuple&lt;T1,T2&gt; 是支持新语言功能的那个。详情请见the C# Tuple type guide

          【讨论】:

            猜你喜欢
            • 2018-06-16
            • 1970-01-01
            • 2017-11-22
            • 2015-04-23
            • 2018-11-11
            • 1970-01-01
            • 2015-04-07
            • 2022-11-03
            • 1970-01-01
            相关资源
            最近更新 更多