Почему перегрузка ValueTuple.Create с 8 кортежами переносит последний параметр в другой ValueTuple? - PullRequest
0 голосов
/ 07 июня 2019

Просматривая исходный код (декомпилированный с помощью JetBrains Rider 2019.1.2) со значением System.ValueTuple Я заметил, что метод, который создает 8-кортеж, упаковывает последний параметр в свой собственный кортеж. Какой смысл заключать элемент в 1-кортеж?

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));
}

Заголовок декомпиляции:

// Decompiled with JetBrains decompiler
// Type: System.ValueTuple
// Assembly: System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
// MVID: CE11CF72-ED8D-4122-8743-9D6985631221
// Assembly location: C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.0.0-preview3-27503-5\System.Private.CoreLib.dll

1 Ответ

1 голос
/ 07 июня 2019

A ValueTuple - это тип с возможностью хранить 7 значений и сказать «и я положу остатки в другой ValueType здесь» (т. Е. Свойство Rest).

Iдо сих пор не понимаю, в чем преимущество переноса последнего параметра в другой ValueTuple.Например, почему бы не заставить программиста объявлять пользовательский тип и использовать его вместо этого?

По двум причинам:

a) Если вы это сделаете, вы фактически перешли с 7 на 8типы / значения.Но это не решает проблему.А как насчет 9?10?

b) Наличие Rest be ValueType означает, что вы можете поддерживать столько типов, сколько захотите.И код, который имеет дело с первыми 7, может быть таким же, как код, который имеет дело со следующими 7 и т. Д., И т. Д. Так как он ValueType полностью вниз.у вас уже есть ValueType в качестве восьмого параметра, вызывайте конструктор, а не Tuple.Create (чтобы избежать переноса ValueTuple в другого ValueTuple).

...