逆变与协变

为了理解逆变(Covariance)与协变(Contravariance),我们需要理解首先什么是子类型(subtype)。

子类型(subtype):如果Cat是Animal的子类型,那么所有引用Animal类型变量的表达式都能使用Cat类型的变量代替Animal类型的变量。

型变关系(Variance)指的是复合子类型的关联关系。例如List<Animal>和List<Cat>之间的关联性,谁应该是谁的子类型呢?

 

不同的复合子类型的构造器会对让不同的复合子类型之间有不同的型变关系。例如,C#中:

 

  1. IEnumerable<Cat>是IEnumerable<Animal>的子类型,IEnumerable<T>对T是协变关系
  2. Action<Animal>是Action<Cat>的子类型,Action<T>对类型T为逆变关系
  3. IList<Cat>和IList<Animal>之间没有相互的子类型关系,称IList<T>对T为不变关系

 

posted @ 2015-12-24 07:32  Nuk9_  阅读(142)  评论(0编辑  收藏  举报