Почему деконструкция в Funcне работает, хотя есть метод расширения Deconstruct? - PullRequest
0 голосов
/ 28 декабря 2018

В следующем примере в функции Test() первая строка успешно компилируется, а вторая - нет, хотя у меня есть метод расширения Deconstruct для KeyValuePair.Почему это?

public static class Tests {
    class Foo { }
    class Bar { }

    public  static void Test() {
        // This works:
        Bar[] works = new List<ValueTuple<Foo, Bar>>()
            .Select(((Foo foo, Bar bar) t) => t.bar).ToArray();

        // But this doesn't, albeit having a `Deconstruct` extension method:
        Bar[] fails = new List<KeyValuePair<Foo, Bar>>()
            .Select(((Foo foo, Bar bar) i) => i.bar).ToArray();
    }

    public static void Deconstruct<TKey, TVal>(this KeyValuePair<TKey, TVal> tuple, out TKey key, out TVal value) {
        key = tuple.Key;
        value = tuple.Value;
    }
}

1 Ответ

0 голосов
/ 28 декабря 2018

Деконструкция - это функция, специально предназначенная для присвоения значений переменным.В вашем коде вы не назначаете значения для переменных, поэтому деконструкция не может происходить.Вы можете просто использовать деконструкцию типа в любом месте, где этого типа можно ожидать (в этом случае, в качестве параметра анонимной функции), вы можете деконструировать его только при назначении переменных .

* 1004.* Для первого выбора, который на самом деле использует кортежи, не происходит деконструкции, это всего лишь синтаксис для кортежа значений.Это не деконструкция (несмотря на то, что она выглядит очень похожей; функции были спроектированы , чтобы выглядеть похожими, но технически они отличаются).
...