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

pko*_*iej 9 ienumerable ienumerator

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

小智 33

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

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

IEnumerator IEnumerable.GetEnumerator() {
    return GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)


And*_*are 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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Tam*_*ege 8

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

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