我想了解最新发布的.NET Framework 4.0及其Covariance and Contravariance in Generics
。.NET 4.0中的协变和反变换的一个很好的实际应用?
尽管我已经阅读了引用的链接上写的内容,但我无法理解它应该如何使用以及何时不应该使用。
一个简单的解释和一个简单的真实世界像代码示例表示赞赏。
谢谢! =)
我想了解最新发布的.NET Framework 4.0及其Covariance and Contravariance in Generics
。.NET 4.0中的协变和反变换的一个很好的实际应用?
尽管我已经阅读了引用的链接上写的内容,但我无法理解它应该如何使用以及何时不应该使用。
一个简单的解释和一个简单的真实世界像代码示例表示赞赏。
谢谢! =)
Eric Meijer在Scott最近的播客中与Scott Hanselman谈论了Reactive Framework,Eric说,在.NET 4.0中,IEnumerable是协变的,但是在.NET 3.5中IEnumerable不是。
这意思是说,如果你有一个Banana
对象,从Fruit
继承,您可将香蕉的水果变量,但你不能传递香蕉的IEnumerable
的方法期待IEnumerable的水果在.NET 3.5 ,因为IEnumerable不是协变的。
从播客:
如果我有香蕉的数组,我可以 职位,在你需要的 水果的数组,因为香蕉是一种分型 水果,所以如果我有一个香蕉阵列 ,你需要一个水果阵列我可以 传递你的数组。现在,如果你想要一个无数的水果,我 不能传递给你一个枚举的 香蕉,因为直到.NET 4.0是不协变的。所以即使香蕉是一种特殊的水果,香蕉 也不是一种水果。
不是真的超现实世界的例子吗? :) – cwap 2010-05-27 18:22:44
@cwap:能够通过covariant收集是一个真正的编程问题;在一种情况下,您只需传递集合,而在另一种情况下,您必须将集合中的每个项目复制到新集合中。如果你真的想要现实世界的例子,听播客。 Eric详细解释了为什么在设计Reactive Framework时这很重要。 – 2010-05-27 18:29:13
承认,没有听播客:)乍一看,我只是没有想到香蕉:水果,是一个真实世界的例子伟大 - 但我们同意这是一个伟大的功能! – cwap 2010-05-27 21:54:22