您无法执行此操作的原因是列表是可写的。假设这是合法的,然后看看出了什么问题:
List<Cat> cats = new List<Cat>();List<Animal> animals = cats; // Trouble brewing...animals.Add(new Dog()); // hey, we just added a dog to a list of cats...cats[0].Speak(); // Woof!
好吧,我的猫,那是坏事。
所需的功能称为“通用协方差”,C#4支持已知安全的接口。
IEnumerable<T>没有任何方法可以写入序列,因此很安全。
class Animal { public virtual void Play(IEnumerable<Animal> animals) { } } class Cat : Animal { public override void Play(IEnumerable<Animal> animals) { } } class Program { static void Main() { Cat cat = new Cat(); cat.Play(new List<Cat>()); } }这将在C#4中起作用,因为它
List<Cat>可以转换为
IEnumerable<Cat>,也可以转换为
IEnumerable<Animal>。Play无法
IEnumerable<Animal>将狗添加到实际上是猫名单的东西上。



