关于c#7.0:ValueTuple:创建octuple有什么问题?

ValueTuple: what is wrong with creation of octuple?

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

方法CreateOctuple()按预期工作:

1
2
3
4
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()方法来实现相同的输出,但不幸的是,它抱怨的是返回类型:

1
2
3
4
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

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

根据Svick的建议

2

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


问题是,ValueTuple.Create已经负责在第8个元素上调用ValueTuple.Create。所以,虽然8元组的正确类型是ValueTuple>,但您正在创建ValueTuple>>。修复方法只是删除对ValueTuple.Create的第二个调用:

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

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

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


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

2


您需要将此包:microsoft.net.compilers更新为2.0(您需要显示预发布)。它可以修正错误,在这里检查这个