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));
}这里怎么了?

所有软件包都是最新的,我正在使用VisualStudio2017 -latest版本。

斯维克的建议
static ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>> OctupleUsingCreate()
{
return ValueTuple.Create(1, 2, 3, 4, 5, 6, 7, 8);
}这会提示相同的编译器异常:

发布于 2017-05-21 13:46:11
问题是,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);
}发布于 2017-05-21 07:44:06
您需要更新这个包: Microsoft.Net.Compilers到2.0 (您需要显示预发布)。它会修复错误,检查这个这里
发布于 2017-05-28 21:12:42
注意:这不是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);
}
}https://stackoverflow.com/questions/44094315
复制相似问题