当我实现IEnumerable<T>接口时,我看到两种GetEnumerator方法:一种返回IEnumerator,另一种IEnumerator<T>。我什么时候会使用一个或另一个?
5608 次
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 回答