为什么列出<>实现IList

时间:2011-05-27 17:58:48

标签: c# .net ilist generic-list

  

可能重复:
  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()); 

5 个答案:

答案 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};