为什么在 Func<KeyValuePair,T> 中解构不起作用,尽管有解构扩展方法?

Why deconstructing in Func<KeyValuePair,T> doesn't work, although having a Deconstruct extension method?

在下面的示例中,在函数 Test() 中,第一行编译成功,而第二行编译失败,即使我有 KeyValuePairDeconstruct 扩展方法。这是为什么?

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

解构是专门为变量赋值的一个特性。在您的代码中,您没有为变量赋值,因此不会发生解构。您可以在任何需要类型的地方使用类型的解构(在这种情况下,作为匿名函数的参数),您只能在分配给变量时解构它

实际使用元组的第一个 select 没有解构,这只是值元组的语法。这不是解构主义(尽管看起来很相似;这些功能被设计看起来很相似,但它们在技术上是不同的功能)。