2008-11-07 69 views
5

概念'协方差'和'逆变'的含义是什么?协方差与类继承的逆变关系

鉴于2班,动物大象(从动物继承),我的理解是,如果你试图把大象到动物的数组,你会得到一个运行时错误,这是因为大象比动物“更大”(更具体)。但是,你能否将一只动物放入一系列大象,看看大象如何保证包含动物特性?

+0

有用:http://blogs.msdn.com/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx – 2010-03-23 05:58:48

+0

[协方差VS逆变]( http://zhlooite.blogspot.com/2011/04/covariance-and-contravariance.html) – 2011-04-11 07:59:12

回答

9

你拥有它倒退。您可以将大象添加到动物数组中,因为它是动物,并且它确保拥有动物所需的所有方法。您不能将动物添加到大象阵列,因为它具有而不是具有大象所需的所有方法。

covariance and contravariance维基百科的文章有一个很好的解释:

在编程语言的类型系统,从类型到类型的操作是协变的,如果它保留了订货,≤,类型,它将类型从更具体的类型定义到更通用的类型;如果它逆转这种排序,它是逆变的。如果这些都不适用,则运营商是不变的。这些术语来自类别理论。

另外,你说这种类型的大象是“更大”,事实并非如此。类型动物是“更大”的,因为它包含更多特定的类型,如大象,长颈鹿和狮子。

0

您应该尝试阅读Introducing .NET 4.0 With Visual Studio 2010的第45-49页,其中涉及这个确切的例子。它甚至有一些很好的大象照片。

主穴取出来就是,要做到这一点

var things = new List<IThing<IContent>> { new ConcreteThing() } 

有:

public class ConcreteThing : IThing<ConcreteContent> 
{ 

} 

需要在接口定义,这将让更多的具体形式是“走出去”设置,但是从IThing读出的任何东西都必须保证是更一般的类型。

public interface IThing<out T> where T : IContent 
{ 
}