为什么ICollection <t>同时实现IEnumerable <t>和IEnumerable </t> </t>

时间:2011-04-05 06:28:29

标签: c# design-patterns generics collections ienumerable

为什么ICollection<T>同时实施IEnumerable<T>IEnumerable

这是为了什么目的? IEnumerable如何使ICollection<T>受益?

3 个答案:

答案 0 :(得分:12)

IEnumerable<T>本身强制任何实现也实现非泛型IEnumerable。这是安全的,原因与{4}在.NET 4中的协变性相同......您可以随时将IEnumerable<out T>转换为T以获取非泛型形式。

基本上这意味着如果您的代码使用object类型的参数,您仍然可以使用类似IEnumerable的内容来调用它。

Eric Lippert写了一篇关于为什么集合最终实现了许多接口的blog post recently,而Brad Abrams写了一篇关于特定List<T> / IEnumerable<T>决定的blog post back in 2005

答案 1 :(得分:9)

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

答案 2 :(得分:-1)

IEnumerable<T>继承IEnumerable因此对ICollection<T>也有意义。它只是明确说明了那里的继承。