【发布时间】:2011-07-29 17:10:12
【问题描述】:
为什么ICollection<T> 同时实现IEnumerable<T> 和IEnumerable?
这样做的目的是什么? IEnumerable 对 ICollection<T> 有什么好处?
【问题讨论】:
标签: c# design-patterns generics collections ienumerable
为什么ICollection<T> 同时实现IEnumerable<T> 和IEnumerable?
这样做的目的是什么? IEnumerable 对 ICollection<T> 有什么好处?
【问题讨论】:
标签: c# design-patterns generics collections ienumerable
IEnumerable<T> 本身强制任何实现也实现非泛型IEnumerable。这是安全的,原因与 IEnumerable<out T> 在 .NET 4 中是协变的原因相同...您始终可以将非泛型形式的 T 转换为 object。
基本上,这意味着如果您的代码使用IEnumerable 类型的参数,您仍然可以使用List<T> 之类的名称调用它。
Eric Lippert 写了一个 blog post recently 来解释为什么集合最终会实现许多接口,Brad Abrams 写了一个 blog post back in 2005 来描述具体的 IEnumerable<T>/IEnumerable 决定。
【讨论】:
IEnumerable<T> 继承 IEnumerable 所以ICollection<T> 也有意义。它只是明确说明无论如何都会存在的继承。
【讨论】:
非通用接口是为了向后兼容。如果您使用泛型编写代码并希望将您的集合传递给用 .NET 1.0(没有泛型)编写的某个模块,您仍然希望这能够成功,并且您希望旧方法能够遍历它。
【讨论】: