【发布时间】:2015-05-13 13:53:29
【问题描述】:
我有以下代码块作为我遇到的问题的简化示例。但我收到一个错误,声称我无法将一种类型转换为另一种类型。我用 LINQPad 测试了一下。
void Main()
{
LivingThing<Appendage> mysteryAnimal = new Cat();
}
public class Appendage { }
public class Paw : Appendage { }
public class LivingThing<TExtremity> where TExtremity : Appendage { }
public class Animal<TExtremity> : LivingThing<TExtremity> where TExtremity : Appendage { }
public class Cat : Animal<Paw> { }
当我知道 Cat 的定义使用 LivingThing 和 Appendage 的子类时,为什么我不能将 Cat 转换为 LivingThing<Appendage>?
【问题讨论】:
-
因为
LivingThing<Paw>不是LivingThing<Appendage>- 阅读协方差... -
类是不变的——你可以创建一个
ILivingThing<out TExtremity>接口,然后你可以做ILivingThing<Appendage> mysteryAnimal = new Cat();。 -
哦,所以类是协变的,但不是泛型?
LivingThing<Appendage> mysteryAnimal = new Animal<Appendage>(); //worksLivingThing<Appendage> mysteryAnimal = new LivingThing<Paw>(); //does not -
所谓的重复显然是相关的,但它没有回答 OP 的问题,即为什么不改变周围就不可能做他想做的事。投票重新开放。
标签: c# generics inheritance covariance