可能重复:
Why does (does it really?) List implement all these interfaces, not just IList?
出于好奇,通用列表<> 实施非通用界面 IList 背后的原因是什么?
示例代码
IList<int> list = new List<int>();
list.Add(1);
//compiles but ArgumentException thrown at run time
((IList)list).Add(new object());
答案 0 :(得分:15)
看看Eric Lippert撰写的这篇博客文章:So many interfaces。他一如既往地有一些很好的见解
请务必阅读整篇文章,但这是回答问题的引用:
为什么List会实现IList?
有点奇怪,因为List for any 除了对象之外的类型没有 履行IList的完整合同。 它可能会让它变得更容易 正在更新旧C#1.0的人 代码使用泛型;那些人 可能已经确保了 只有正确的类型进入他们的 名单。而且大多数时候都是 你正在经历一个伊利诺伊州,它是 所以被调用者可以通过索引访问 到列表,而不是它可以添加 任意类型的新项目。
答案 1 :(得分:3)
IList
具有特定的重要性。特别是,它形成了大量数据绑定的中心,并且在很大程度上充当了说“我是一堆项目”的规范方式。
另请注意 - 泛型通过反射不方便;数据绑定与它们有点挣扎,更喜欢非通用API。在绑定方案中,数据绑定代码使用的约定是有帮助的,如果列表也具有非object
索引器:
public SomeType this[int index] {get;}
然后假设项目SomeType. Which of course
List`令人钦佩。
因此;这提供了大量与现有代码和数据绑定支持的向后兼容性。
答案 2 :(得分:2)
向后兼容性。这样就可以将它注入到1.0 / 1.1的旧框架/库中,或者从1.0 / 1.1迁移而不是完全重构,或者与2.0+ .Net框架中的对象一起使用,这些框架仍然具有与1.0版相同的接口。 /1.1,无需在新代码中放弃类型安全。
答案 3 :(得分:1)
我相信List实现了IList的一个版本,因为它很简单,并且可能很有用,因为你不需要将列表包装在另一个中以将它传递给另一个类。
然而,它会对您尝试添加的任何项目进行类型检查,如果不匹配则会抛出。
答案 4 :(得分:0)
原因是您可以拥有不同类型的列表。 例如 -
List<int> ints = new List<int>();
List<string> strings = new List<string>();
List<IList> lists = new List<IList> { ints, strings};