概念'协方差'和'逆变'的含义是什么?协方差与类继承的逆变关系
鉴于2班,动物和大象(从动物继承),我的理解是,如果你试图把大象到动物的数组,你会得到一个运行时错误,这是因为大象比动物“更大”(更具体)。但是,你能否将一只动物放入一系列大象,看看大象如何保证包含动物特性?
概念'协方差'和'逆变'的含义是什么?协方差与类继承的逆变关系
鉴于2班,动物和大象(从动物继承),我的理解是,如果你试图把大象到动物的数组,你会得到一个运行时错误,这是因为大象比动物“更大”(更具体)。但是,你能否将一只动物放入一系列大象,看看大象如何保证包含动物特性?
你拥有它倒退。您可以将大象添加到动物数组中,因为它是是动物,并且它确保拥有动物所需的所有方法。您不能将动物添加到大象阵列,因为它具有而不是具有大象所需的所有方法。
上covariance and contravariance维基百科的文章有一个很好的解释:
在编程语言的类型系统,从类型到类型的操作是协变的,如果它保留了订货,≤,类型,它将类型从更具体的类型定义到更通用的类型;如果它逆转这种排序,它是逆变的。如果这些都不适用,则运营商是不变的。这些术语来自类别理论。
另外,你说这种类型的大象是“更大”,事实并非如此。类型动物是“更大”的,因为它包含更多特定的类型,如大象,长颈鹿和狮子。
您应该尝试阅读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
{
}
有用:http://blogs.msdn.com/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx – 2010-03-23 05:58:48
[协方差VS逆变]( http://zhlooite.blogspot.com/2011/04/covariance-and-contravariance.html) – 2011-04-11 07:59:12