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