为什么ICollection 同时实现IEnumerable 和IEnumerable
为什么ICollection
实现IEnumerable
和IEnumerable
?
这样做的目的是什么? IEnumerable
如何使ICollection
受益?
非通用接口用于向后兼容。 如果你使用generics编写代码并希望将集合传递给用.NET 1.0编写的某个模块(没有generics),你仍然希望这个成功,并且你希望旧方法能够遍历它。
IEnumerable
本身强制任何实现也实现非通用的IEnumerable
。 这是安全的,出于同样的原因, IEnumerable
在.NET 4中是协变的……你总是可以将T
转换为非genericsforms的object
。
基本上这意味着如果你有使用IEnumerable
类型参数的代码,你仍然可以用类似List
调用它。
Eric Lippert 最近写了一篇关于为什么集合最终会实现许多接口的博客文章 ,而Brad Abrams 在2005年写了一篇关于特定IEnumerable
/ IEnumerable
决定的博客文章 。
IEnumerable
inheritanceIEnumerable
因此ICollection
也是有意义的。 它只是明确说明了那里的inheritance。