IEnumerable <t>提供了两个GetEnumerator方法 - 它们之间有什么区别?</t>

时间:2009-02-18 11:27:18

标签: ienumerable ienumerator

当我实施IEnumerable<T>界面时,我会看到两个GetEnumerator方法:一个返回IEnumerator和另一个IEnumerator<T>。我何时会使用其中一种?

5 个答案:

答案 0 :(得分:33)

您通常同时实施这两项。一个是更新的通用版本,它返回一个类型安全的枚举器(IEnumerator<T>)。另一个是与Legacy代码兼容(返回IEnumerator)。典型的实现是:

public IEnumerator<T> GetEnumerator() {
    foreach(T item in items) {
        yield return item;
    }
}

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

答案 1 :(得分:12)

有两种方法的原因是因为IEnumerable<T>继承了IEnumerable接口,因此您可以看到来自IEnumerable<T>的泛型方法和来自IEnumerable的非泛型方法。

以下是您希望在类型中实现界面的方法:

class Foo : IEnumerable<Foo>
{
    public IEnumerator<Foo> GetEnumerator()   
    {
        // do your thing here
    }

    // do a EIMI here and simply call the generic method
    IEnumerator IEnumerable.GetEnumerator()
    {
        this.GetEnumerator();
    }
}

答案 2 :(得分:8)

如果要实现IEnumerable<T>通用接口,则几乎总是必须使用通用的GetEnumerator方法 - 除非您将对象显式转换为(非泛型)IEnumerable。

原因是与.NET 1.0 / 1.1的后向兼容性不支持泛型。

答案 3 :(得分:4)

通常GetEnumerator()会调用GetEnumerator<T>(),因此行为不应有太大差异。至于为什么有两种方法,这是为了向后兼容,并用于T没有太大兴趣(或者只是未知)的情况。

答案 4 :(得分:2)

一个是通用的,另一个不是。我相信编译器更喜欢使用泛型重载。