C# 为什么ICollection<;T>;实现IEnumerable<;T>;而且是数不清的

C# 为什么ICollection<;T>;实现IEnumerable<;T>;而且是数不清的,c#,design-patterns,generics,collections,ienumerable,C#,Design Patterns,Generics,Collections,Ienumerable,为什么ICollection同时实现IEnumerable和IEnumerable 这样做的目的是什么?IEnumerable对ICollection有什么好处?非通用接口用于向后兼容。如果您使用泛型编写代码,并希望将集合传递给使用.NET 1.0编写的某个模块(该模块没有泛型),那么您仍然希望此操作成功,您希望旧方法能够遍历它。IEnumerable继承了IEnumerable,因此,ICollection也有意义。它只是明确地说明无论如何都会存在的继承。IEnumerable本身强制任何实现

为什么
ICollection
同时实现
IEnumerable
IEnumerable


这样做的目的是什么?
IEnumerable
ICollection
有什么好处?

非通用接口用于向后兼容。如果您使用泛型编写代码,并希望将集合传递给使用.NET 1.0编写的某个模块(该模块没有泛型),那么您仍然希望此操作成功,您希望旧方法能够遍历它。

IEnumerable
继承了
IEnumerable
,因此,
ICollection
也有意义。它只是明确地说明无论如何都会存在的继承。

IEnumerable
本身强制任何实现也实现非泛型的
IEnumerable
。这是安全的,原因与.NET 4中的
IEnumerable
是协变的一样。。。对于非泛型表单,始终可以将
T
转换为
object

基本上这意味着,如果您有使用类型为
IEnumerable
的参数的代码,您仍然可以使用类似
List
的东西调用它

Eric Lippert写了一篇关于为什么集合最终实现了许多接口的文章,Brad Abrams写了一篇关于特定的
IEnumerable
/
IEnumerable
决策的文章。

有些相似: