【问题标题】:Why does ICollection<T> implement both IEnumerable<T> and IEnumerable为什么 ICollection<T> 同时实现 IEnumerable<T> 和 IEnumerable
【发布时间】:2011-07-29 17:10:12
【问题描述】:

为什么ICollection&lt;T&gt; 同时实现IEnumerable&lt;T&gt;IEnumerable

这样做的目的是什么? IEnumerableICollection&lt;T&gt; 有什么好处?

【问题讨论】:

标签: c# design-patterns generics collections ienumerable


【解决方案1】:

IEnumerable&lt;T&gt; 本身强制任何实现也实现非泛型IEnumerable。这是安全的,原因与 IEnumerable&lt;out T&gt; 在 .NET 4 中是协变的原因相同...您始终可以将非泛型形式的 T 转换为 object

基本上,这意味着如果您的代码使用IEnumerable 类型的参数,您仍然可以使用List&lt;T&gt; 之类的名称调用它。

Eric Lippert 写了一个 blog post recently 来解释为什么集合最终会实现许多接口,Brad Abrams 写了一个 blog post back in 2005 来描述具体的 IEnumerable&lt;T&gt;/IEnumerable 决定。

【讨论】:

    【解决方案2】:

    IEnumerable&lt;T&gt; 继承 IEnumerable 所以ICollection&lt;T&gt; 也有意义。它只是明确说明无论如何都会存在的继承。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-12
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        • 2014-12-04
        • 1970-01-01
        相关资源
        最近更新 更多