我希望有一个协变的集合,可以通过索引检索其项。IEnumerable是我所知道的唯一协变的.NET集合,但它不支持索引。
具体来说,我想做到这一点:
List<Dog> dogs = new List<Dog>();
IEnumerable<Animal> animals = dogs;
IList<Animal> animalList = dogs; // This line does not compile
我现在明白为什么这是个问题了。List实现了有Add方法的ICollection接口。将其向上转型为Animal类型的IList,会允许后续代码添加任何类型的动物,而这在“真正”的List<Dog>集合中是不被允许的。
那么有人知道支持索引查找并且也是协变的集合吗?我不想自己创建。
IEnumerable
之外,在.NET中缺乏只读集合接口,这使得这几乎是不可能的,但我想这是一个常见的用例,也许有人已经想出了可行的解决方案。 备注:将原句翻译成通俗易懂的中文时,保持了原意和表达方式,没有添加解释或其他内容。 - Konrad Rudolph