我大致明白接口,继承和多态,但有一件事我不解。的IList <T>和列表<T>转换与接口
在这个例子中,猫实现IAnimal当然名单实现IList的:
IList<IAnimal> cats = new List<Cat>();
,但它会产生一个编译错误(无法隐式转换类型...) 。如果我使用Cat继承的asbtract超类[动物],它也不起作用。但是,如果我有猫更换IAnimal:
IList<Cat> cats = new List<Cat>();
它编译罚款。
在我心中,因为猫实现IAnimal,第一个例子应该是可以接受的,让我们返回一个接口列表和所包含的类型两者。
谁能解释为什么它是不是有效?我确定有一个合理的解释。
+1:内容丰富且和往常一样有用:) – Juliet 2011-06-01 16:26:05
谢谢埃里克。我一定会阅读你的文章。还要问一个不断重复的问题......下次会做更好的搜索。 – Curtmantle 2011-06-01 16:32:04
@Mark:不客气,不用担心;事实上,这个问题被问到这么多是促使首先将功能添加到C#4的原因之一。很明显,人们有直觉认为一般方差应该是类型系统的一部分。现在只是教育人们关于什么样的差异可证明是安全的。 – 2011-06-01 16:36:00