为什么ValueTuple.Create 8元组重载将最后一个参数包装在另一个ValueTuple中?

时间:2019-06-07 13:16:49

标签: c# .net-core language-design

浏览System.ValueTuple的源代码(使用JetBrains Rider 2019.1.2进行反编译)时,我注意到创建8元组的方法将最后一个参数包装在其自身的元组中。将元素包装到1元组中有什么意义?

| Book.isbn   | Paper.material | max(Book.date)       |
|-------------|----------------|----------------------|
| X1726748384 | 10985782343E   | 2018-01-01T00:00:00Z |
| X1837943875 | 10985782343H   | 2021-01-01T00:00:00Z |
etc...

反编译标头:

public static ValueTuple<T1, T2, T3, T4, T5, T6, T7, ValueTuple<T8>> Create<T1, T2, T3, T4, T5, T6, T7, T8>(
    T1 item1,
    T2 item2,
    T3 item3,
    T4 item4,
    T5 item5,
    T6 item6,
    T7 item7,
    T8 item8)
{
    return new ValueTuple<T1, T2, T3, T4, T5, T6, T7, ValueTuple<T8>>(item1, item2, item3, item4, item5, item6, item7, ValueTuple.Create<T8>(item8));
}

1 个答案:

答案 0 :(得分:1)

ValueTuple是一种类型,能够存储7个值并说“我将把剩下的值放在这里的另一个ValueType中”(即Rest属性)。

  

我还是不明白将最后一个包裹起来有什么好处   另一个ValueTuple中的参数。例如,为什么不强制   程序员声明一个自定义类型并使用它吗?

有两个原因:

a)如果这样做,您实际上可以从7种类型/值转换为8种类型/值。但这并不能解决问题。那9呢? 10?

b)使RestValueType意味着您可以支持任意数量的类型。并且处理前7个代码的代码可以与处理后7个代码的代码相同,依此类推。因为它一直是ValueType

此外,请注意,如果您已经将ValueType作为八个参数,请调用构造函数,而不要调用Tuple.Create(以避免将ValueTuple包裹在 ValueTuple)。