回答
你可能想看看这个博客,他做了一个很棒的工作来解释它,但我认为它需要更多的例子来为人们清理它,因为这进入了一个非常难以理解的领域,但是,文章中的下面引用总结得很好。
http://hestia.typepad.com/flatlander/2008/12/c-covariance-and-contravariance-by-example.html
“协变和逆变”是指 您现在可以通过不精确通用 类型时,它是安全的这样做,就像 可以传递不准确的参数类型 当它是安全的这样做。
以下文章涉及与代表的共同作用和反作用:http://msdn.microsoft.com/en-us/library/ms173174.aspx。
即使您还没有进入代表,它可能对您有用。我发现它很容易理解。
MSDN文档的C#4.0(和VB)的位置:Covariance and Contravariance
如果你有兴趣在具体的例子,他们在这里:
埃里克利珀一个很好的解释在最近blog post
一个Tiger
想出是Animal
所以它可以做任何事情的Animal
可以做。如果我有一个方法,要求Animal
我也可以通过Tiger
。
协方差 - 传递一个更具体的类型参数
这是你最熟悉的方向。我可以在任何需要IEnumerable<Animal>
的地方通过IEnumerable<Tiger>
。
static void ListAnimals(IEnumerable<Animal> animals)
{
}
List<Tiger> tigers = new List<Tiger>();
ListAnimals(tigers);
逆变 - 传递一个更一般的类型参数。
“对比”意味着这与'正常转换流'相反。这一个更棘手,因为它看起来是反直觉的,直到你看到它在行动。
说我有一个功能,它需要IComparer<Tiger>
和两只老虎进行比较。反变化说我也可以通过更通用的IComparer<Animal>
,因为它可以也比较两只老虎(因为老虎是一只动物)。它以更一般的方式比较它们,但这仍然是类型安全的。
static void CompareTigers(IComparer<Tiger> comparer, Tiger tiger1, Tiger tiger2)
{
comparer.Compare(tiger1, tiger2);
}
// normal - a tiger comparer can compare two tigers
IComparer<Tiger> tigerComparer = null;
CompareTigers(tigerComparer, new Tiger(), new Tiger());
// contravariance - an animal comparer can ALSO compare two tigers
IComparer<Animal> animalComparer = null;
CompareTigers(animalComparer, new Tiger(), new Tiger());
请注意,这也适用于委托。我可以将Action<Animal>
传递给期望Action<Tiger>
的函数,因为Tiger
对象也可以安全地传递给Action<Animal>
委托。
- 1. .NET 4.0泛型不变,协变,反变
- 2. C#4.0中协变和反变换的真实用例的实例?
- 3. C#4.0中的协变和逆变推断
- 4. .NET 4.0中的协变和反变换的一个很好的实际应用?
- 5. 协方差和反变量
- 6. 在Java泛型的协变和反变量中的写入
- 7. 协变和隐藏在C++
- 8. IsAssignable从协方差和反变换
- 9. 了解asp.net 4.0中的“using”语句 - C#
- 10. 协变和IList
- 11. 了解$ _POST和$ _SESSION变量
- 12. Silverlight 4.0协变的替代方案4.0 IEnumerable <T>
- 13. 反应变量在jsx中变化
- 14. .NET 4.0和C#4.0中的事件和委托反转现象
- 15. 如何初始化协变变量?
- 16. C#4.0中的新动态变量
- 17. 了解局部变量初始化
- 18. 在C#4.0中,为什么方法中的out参数不能协变?
- 19. ProgressBar不反映价值变化C#
- 20. angular.copy反映分配变量的变化
- 21. 了解.Net 4.6和4.6.2之间的差异/变化
- 22. Java中的协变
- 23. C#泛型类中的协变性
- 24. C:全局,静态变量了解
- 25. 了解RobotFramework变量
- 26. 了解ons.slidingMenu变量
- 27. C#4.0 RC,Silverlight 4.0 RC协方差
- 28. 了解协议
- 29. C#通用协变错误
- 30. 反序列化时对象发生了变化
什么是Channel 9? – 2009-11-12 19:55:27
http://channel9.msdn.com/ - 有关微软开发框架的视频集合,以及更多:) – cwap 2009-11-12 19:56:59
是啊,它就像一个播客,有一些非常好的安德斯等C#视频等。 – 2009-11-12 19:58:48