为什么ICollection 同时实现IEnumerable 和IEnumerable

为什么ICollection实现IEnumerableIEnumerable

这样做的目的是什么? IEnumerable如何使ICollection受益?

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

IEnumerable本身强制任何实现也实现非通用的IEnumerable 。 这是安全的,出于同样的原因, IEnumerable在.NET 4中是协变的……你总是可以将T转换为非genericsforms的object

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

Eric Lippert 最近写了一篇关于为什么集合最终会实现许多接口的博客文章 ,而Brad Abrams 在2005年写了一篇关于特定IEnumerable / IEnumerable决定的博客文章 。

IEnumerableinheritanceIEnumerable因此ICollection也是有意义的。 它只是明确说明了那里的inheritance。