【问题标题】:ValueTuple: what is wrong with creation of octuple?ValueTuple:创建八元组有什么问题?
【发布时间】:2017-10-21 00:23:34
【问题描述】:

ValueTuple 作为 C# 7.0 中的一个新特性,它具有公共方法 Create,它有助于创建 ValueTuples(来自 singleton to octuple 或更多),另一方面,我们也可以使用 new 来实现相同的结果。我注意到这些行为不同。我正在尝试研究以下实现错误,或者这是按照设计:

方法CreateOctuple()按预期工作:

private static ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>> CreateOctuple()
{
     return new ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>>(1, 2, 3, 4, 5, 6, 7, new ValueTuple<int>(8)); ;
}

现在,我尝试使用Create() 方法实现相同的输出,不幸的是,它抱怨返回类型:

private static ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>> OctupleUsingCreate()
{
    return ValueTuple.Create(1, 2, 3, 4, 5, 6, 7, ValueTuple.Create(8));
}

这里有什么问题?

附:所有软件包都是最新的,我使用的是 Visual Studio 2017 最新版本。

根据 Svick 的建议

static ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>> OctupleUsingCreate()
{
  return ValueTuple.Create(1, 2, 3, 4, 5, 6, 7, 8);
}

这会提示相同的编译器异常:

【问题讨论】:

    标签: c#-7.0 valuetuple


    【解决方案1】:

    你需要更新这个包:Microsoft.Net.Compilers 到 2.0(你需要显示预发布)。它将修复错误,检查此here

    【讨论】:

    • 感谢您的及时回复。所有 Nuget 包都是最新的,我已经用截图更新了问题。
    【解决方案2】:

    问题是ValueTuple.Create 已经负责在第 8 个元素上调用 ValueTuple.Create。因此,虽然 8 元组的正确类型是 ValueTuple&lt;int, int, int, int, int, int, int, ValueTuple&lt;int&gt;&gt;,但您正在创建 ValueTuple&lt;int, int, int, int, int, int, int, ValueTuple&lt;ValueTuple&lt;int&gt;&gt;&gt;。修复只是删除对ValueTuple.Create 的第二次调用:

    static ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>> OctupleUsingCreate()
    {
        return ValueTuple.Create(1, 2, 3, 4, 5, 6, 7, 8);
    }
    

    或者您可以只使用元组语法,但我假设您有理由避免使用它:

    static (int, int, int, int, int, int, int, int) OctupleUsingCreate()
    {
        return (1, 2, 3, 4, 5, 6, 7, 8);
    }
    

    【讨论】:

    • 我已经试过了。但它不起作用。我用快照和建议的代码更新了问题。
    • @GauravAroraa 这只是一个 ReSharper 错误。代码实际上可以编译并且工作正常。
    • @GauravAroraa 我只有reported it
    • 代码已编译 - 在另一个未安装 Resharper 的系统上。
    • @GauravAroraa 即使你安装了 ReSharper,你也可以编译它。红色的波浪线仍然存在,但构建会成功且不会出错。
    【解决方案3】:

    注意:这不是 ValueTuple 库或 C# 编译器的问题。 TryRoslyn 没有错误:

    using System;
    public class C 
    {
        private static ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>> OctupleUsingCreate()
        {
            return ValueTuple.Create(1, 2, 3, 4, 5, 6, 7, 8);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      • 2012-01-17
      • 2020-08-06
      • 1970-01-01
      相关资源
      最近更新 更多