9

当我实现IEnumerable<T>接口时,我看到两种GetEnumerator方法:一种返回IEnumerator,另一种IEnumerator<T>。我什么时候会使用一个或另一个?

4

5 回答 5

33

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

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

IEnumerator IEnumerable.GetEnumerator() {
    return GetEnumerator();
}
于 2009-02-18T11:33:40.200 回答
12

有两种方法的原因是因为IEnumerable<T>继承了IEnumerable接口,所以你看到的是泛型方法 fromIEnumerable<T>和非泛型方法 from 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();
    }
}
于 2009-02-18T11:33:19.750 回答
8

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

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

于 2009-02-18T11:33:48.360 回答
4

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

于 2009-02-18T11:32:59.703 回答
2

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

于 2009-02-18T11:31:14.527 回答