【问题标题】:Why must IEnumerator<T> GetEnumerator() and GetEnumerator() be implemented?为什么必须实现 IEnumerator<T> GetEnumerator() 和 GetEnumerator()?
【发布时间】:2014-01-09 17:54:19
【问题描述】:

致力于实现IEnumerable 接口。 我其实找到了两个需要实现的方法:

public IEnumerator<Item> GetEnumerator()
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()

不知道为什么我需要实现这两种方法(看起来很相似)。谁能给我解释一下?

【问题讨论】:

    标签: c# iterator ienumerable ienumerator


    【解决方案1】:

    部分答案是“出于历史原因”。

    IEnumerable 接口自 .NET 1.1 以来一直存在,而泛型(因此 IEnumerable&lt;T&gt;)被添加到 .NET 2 中。IEnumerable&lt;T&gt; 扩展了 IEnumerable,这是一个明智的决定,因为它允许您在已经编写的代码中使用IEnumerable&lt;T&gt; 以获取IEnumerable

    但这意味着要实现IEnumerable&lt;T&gt;(包括IEnumerator&lt;T&gt; GetEnumerator() 方法),您还必须实现IEnumerable(包括IEnumerator GetEnumerator() 方法)。

    正如 Servy 所说,这没什么大不了的,因为您可以这样做:

    IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
    

    其中非显式实现GetEnumerator 的返回类型为IEnumerator&lt;T&gt;

    【讨论】:

      【解决方案2】:

      IEnumerable&lt;T&gt; 扩展了IEnumerable,因此您需要提供该方法的泛型和非泛型版本。

      一个常见的解决方案是让非通用解决方案简单地调用通用解决方案,因为IEnumerator&lt;T&gt; 也扩展了IEnumerator

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-25
        • 1970-01-01
        • 2014-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多