ValueTuple:创建octuple有什么问题?

时间:2017-05-21 07:33:36

标签: c#-7.0 valuetuple

作为C#7.0中的一项新功能,ValueTuple具有公共方法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));
}

这里有什么问题? enter image description here

P.S。所有软件包都是最新的,我使用的是Visual Studio 2017最新版本。 enter image description here

正如Svick所建议

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

这会提示相同的编译器异常: enter image description here

3 个答案:

答案 0 :(得分:5)

问题是ValueTuple.Create已经负责在第8个元素上调用ValueTuple.Create。因此,虽然8元组的正确类型为ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>>,但您正在创建ValueTuple<int, int, int, int, int, int, int, ValueTuple<ValueTuple<int>>>。修复只是删除对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);
}

答案 1 :(得分:0)

您需要更新此软件包:Microsoft.Net.Compilers到2.0(您需要显示预发布)。它会修复错误,请检查此here

答案 2 :(得分:0)

注意:这不是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);
    }
}
相关问题