的IEnumerable 提供了两种方法的GetEnumerator - 它们之间有什么区别呢?

StackOverflow https://stackoverflow.com/questions/560678

  •  05-09-2019
  •  | 
  •  

当我emplement IEnumerable<T>接口I看到两个GetEnumerator方法:一种返回IEnumeratorIEnumerator<T>。何时使用一种或另一种?

有帮助吗?

解决方案

如果您正在实施IEnumerable<T>通用接口,你将几乎总是要使用泛型GetEnumerator方法 - 除非你投你的目标明确地(非通用)的IEnumerable

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

其他提示

您通常实现这两个。一个是新的,通用的版本,返回一个类型安全的枚举(IEnumerator<T>)。另一种是用于与传统代码(返回IEnumerator)的兼容性。一个典型的实现是:

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

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

的原因,有两种方法是因为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();
    }
}

通常GetEnumerator()调用GetEnumerator<T>(),所以不应该在行为太大的差别。至于为什么有两种方法,这是为了向下兼容,并在情况使用其中T不是很大的兴趣(或只是未知)来完成。

在一个是通用的,而另一个不是。我相信,编译器更喜欢使用通用过载。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top