为什么在 Func<KeyValuePair,T> 中解构不起作用,尽管有解构扩展方法?
Why deconstructing in Func<KeyValuePair,T> doesn't work, although having a Deconstruct extension method?
在下面的示例中,在函数 Test()
中,第一行编译成功,而第二行编译失败,即使我有 KeyValuePair
的 Deconstruct
扩展方法。这是为什么?
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 没有解构,这只是值元组的语法。这不是解构主义(尽管看起来很相似;这些功能被设计看起来很相似,但它们在技术上是不同的功能)。
在下面的示例中,在函数 Test()
中,第一行编译成功,而第二行编译失败,即使我有 KeyValuePair
的 Deconstruct
扩展方法。这是为什么?
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 没有解构,这只是值元组的语法。这不是解构主义(尽管看起来很相似;这些功能被设计看起来很相似,但它们在技术上是不同的功能)。