ValueTuple:创建八元组有什么问题?
ValueTuple: what is wrong with creation of octuple?
ValueTuple 作为 C# 7.0 中的一项新功能,具有 public 方法 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()
方法实现相同的输出,不幸的是,它抱怨 return 类型:
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));
}
这里有什么问题?
P.S。所有软件包都是最新的,我使用的是 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);
}
这会提示相同的编译器异常:
您需要更新此包:Microsoft.Net.Compilers 到 2.0(您需要显示预发布)。它会修复错误,检查这个
问题是 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);
}
注意:这不是 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);
}
}
ValueTuple 作为 C# 7.0 中的一项新功能,具有 public 方法 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()
方法实现相同的输出,不幸的是,它抱怨 return 类型:
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));
}
这里有什么问题?
P.S。所有软件包都是最新的,我使用的是 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);
}
这会提示相同的编译器异常:
您需要更新此包:Microsoft.Net.Compilers 到 2.0(您需要显示预发布)。它会修复错误,检查这个
问题是 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);
}
注意:这不是 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);
}
}