当我实施IEnumerable<T>
界面时,我会看到两个GetEnumerator
方法:一个返回IEnumerator
和另一个IEnumerator<T>
。我何时会使用其中一种?
答案 0 :(得分:33)
您通常同时实施这两项。一个是更新的通用版本,它返回一个类型安全的枚举器(IEnumerator<T>
)。另一个是与Legacy代码兼容(返回IEnumerator
)。典型的实现是:
public IEnumerator<T> GetEnumerator() {
foreach(T item in items) {
yield return item;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
答案 1 :(得分: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();
}
}
答案 2 :(得分:8)
如果要实现IEnumerable<T>
通用接口,则几乎总是必须使用通用的GetEnumerator方法 - 除非您将对象显式转换为(非泛型)IEnumerable。
原因是与.NET 1.0 / 1.1的后向兼容性不支持泛型。
答案 3 :(得分:4)
通常GetEnumerator()
会调用GetEnumerator<T>()
,因此行为不应有太大差异。至于为什么有两种方法,这是为了向后兼容,并用于T
没有太大兴趣(或者只是未知)的情况。
答案 4 :(得分:2)
一个是通用的,另一个不是。我相信编译器更喜欢使用泛型重载。