2

ValueTuple 作为 C# 7.0 中的一个新特性,它具有Create有助于创建 ValueTuple(来自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));
}

这里有什么问题? 在此处输入图像描述

PS 所有软件包都是最新的,我使用的是 Visual Studio 2017 最新版本。 在此处输入图像描述

正如斯维克所建议的那样

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

这会提示相同的编译器异常: 在此处输入图像描述

4

3 回答 3

5

问题是它ValueTuple.Create已经处理了调用ValueTuple.Create第 8 个元素。因此,虽然 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-21T13:46:11.970 回答
0

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

于 2017-05-21T07:44:06.323 回答
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);
    }
}
于 2017-05-28T21:12:42.067 回答