为什么列出<>;实现IList

本文关键字:实现 IList gt lt 为什么 | 更新日期: 2023-09-27 17:57:46

可能重复:
为什么List实现了所有这些接口,而不仅仅是IList?

出于好奇,通用List<>背后的原因是什么实现非通用接口IList

样本代码

IList<int> list = new List<int>();
list.Add(1);
//compiles but ArgumentException thrown at run time
((IList)list).Add(new object()); 

为什么列出<>;实现IList

看看Eric Lippert的这篇博客文章:界面太多了。他有一些伟大的见解,一如既往的

请务必阅读整件事,但这里有一句话可以回答这个问题:

那么List为什么要实现IList

这有点奇怪,因为任何对象以外的类型没有履行IList的全部合同。这可能是为了让它更容易正在更新旧C#1.0的人员使用泛型的代码;那些人可能已经在确保只有合适的人才进入列表。大多数时候你在传递一个IList,它是因此被调用者可以通过索引访问添加到列表中,而不是为了添加任意类型的新项目。

IList具有特殊意义。特别是,它形成了许多数据绑定的中心,并在很大程度上充当了表示"我是一堆项目"的规范方式。

还需要注意的是,泛型通过反射并不方便;数据绑定与它们有点冲突,更喜欢非通用API。这有助于在绑定场景中,数据绑定代码使用的约定是,如果列表具有非object索引器:

public SomeType this[int index] {get;}

则假定项目是令人钦佩地满足的CCD_ 3列表。

所以;这通过它提供了与现有代码数据绑定支持的大量向后兼容性。

向后兼容性。通过这种方式,它可以被注入到1.0/1.1的旧框架/库中,或者从1.0/1.1迁移而来但没有完全重构,或者与2.0+.Net框架中的对象一起使用,这些对象仍然使用与1.0/1.1中相同的接口,而不必在新代码中放弃类型安全。

我相信List实现了IList的一个版本,因为这很简单,而且可能很有用,因为您不需要将列表包装在另一个类中就可以将其传递到另一个类别中。

然而,它确实会对您尝试添加的任何项目进行类型检查,如果它们不匹配,就会抛出。

原因是您能够拥有不同类型的IList列表。例如

List<int> ints = new List<int>();
List<string> strings = new List<string>();
List<IList> lists = new List<IList> { ints, strings};