为什么List<>实现了IList?

10

8
不算完全重复,因为那个问题是关于通用接口的,而这个问题是针对非通用接口的。编辑: 这也适用于所有没有仔细阅读就关闭问题的人。 - Etienne de Martel
@SwDevMan81,我在询问非泛型接口。但还是谢谢你指出来。 - oleksii
为了与预生成代码(或选择使用IList而不是通用替代品的代码)保持向后兼容性。这可能是这个问题的重复https://dev59.com/sG445IYBdhLWcg3wg6tm,其中有以下回答讨论向后兼容性https://dev59.com/sG445IYBdhLWcg3wg6tm/4817419#4817419。 - bentayloruk
@SwDevMan81:@bentayloruk选择了正确的重复内容。你也很接近了。 - Gabe
显示剩余3条评论
5个回答

16
请看Eric Lippert写的这篇博客文章:《那么多接口》。他总是有很深刻的见解。
一定要阅读全文,但这里是回答问题的引用:
“为什么List实现了IList呢?” 它有点奇怪,因为除了对象类型之外的任何类型,List都不能完全执行IList的所有合约。这可能是为了让更新旧的C# 1.0代码使用泛型更容易的人们更容易一些;这些人可能已经确保只有正确的类型被放入列表中。当你传递一个IList时,大多数情况下是为了让被调用方可以通过索引访问列表,而不是为了添加任意类型的新项。

链接现在已经失效 - 幸运的是相关部分已经在回答正文中引用了。不幸的是,Wayback Machine 也没有那篇博客文章的副本。如果有人在其他地方找到了这篇文章,请更新链接。 - alelom

3
"IList"具有特别重要的意义。特别是,它是许多数据绑定的中心,并且在很大程度上充当着“我是一堆项目”的规范方式。
另外需要注意的是- 通过反射使用泛型并不方便;数据绑定在处理泛型时会遇到一些问题,更喜欢非泛型API。在绑定场景中,数据绑定代码使用的惯例是:如果列表还具有非“object”索引器,则会帮助解决问题。"
public SomeType this[int index] {get;}

假设这些项目是SomeType,那么List就非常适合。因此,这提供了与现有代码的充分向后兼容性和通过此项支持的数据绑定。

2

向后兼容。这样可以将其注入到旧的框架/库中,这些框架/库是1.0/1.1版本,或者是从1.0/1.1迁移过来但未完全重构,或者与2.0+ .Net框架中仍具有1.0/1.1接口的对象一起使用,而不必在新代码中放弃类型安全性。


那么为什么不是针对 ICollection<T> 到 ICollection...? - Srinivas Reddy Thatiparthy
1
处理反射时,这也是一个很大的便利。 - leppie
@Srinivas:Collection<T> 还实现了非泛型 ICollection、IList 和 IEnumerable 接口。 - Toby
2
@Srinivas Reddy Thatiparthy - 如果 ICollection<T> 包括 ICollection,那么就会要求泛型集合实现非泛型接口。这种要求是不必要和繁琐的。这与原问题不同。IList<T> 也不包括 IList - Jeffrey L Whitledge

1

我相信List实现了IList的一个版本,因为这很容易做到,并且可能很有用,因为您不需要将列表包装在另一个类中才能传递它。

但是,它确实对您尝试添加的任何项进行类型检查,如果它们不匹配,则会抛出异常。


实现几乎所有接口都是微不足道的,但类型并不这样做。背后有更重要的原因。 - oleksii
@oleksii:我的原始回复是基于它是只读版本的,所以试图举例说明“为什么不”足够合理。一旦我意识到它是可读写的,就应该进行编辑以更好地表达,但已经有另一个回复了,所以这是一个无关紧要的问题。 - Guvante

0

这样做的原因是让您能够拥有不同类型的ILists列表。

例如 -

List<int> ints = new List<int>();
List<string> strings = new List<string>();

List<IList> lists = new List<IList> { ints, strings};

那是一个有趣的列表嵌套 :) 然而,正如我们所发现的,它是为了向后兼容性而需要的。感谢您的尝试。 - oleksii
@oleksii:值得注意的是,如果不介意IList.ReadOnly返回与IList<T>.ReadOnly不同的值,List<T>可以以类型安全的方式实现IList<T>。换句话说,我们可以使可变的List<T>表现为类型安全的只读IList - supercat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接