pko*_*iej 9 ienumerable ienumerator
当我实现IEnumerable<T>界面时,我看到两个GetEnumerator方法:一个返回IEnumerator和另一个IEnumerator<T>.我何时会使用其中一种?
小智 33
你通常都实现这两个.一个是更新的通用版本,它返回一个类型安全的枚举器(IEnumerator<T>).另一个是与Legacy代码兼容(返回IEnumerator).典型的实现是:
public IEnumerator<T> GetEnumerator() {
foreach(T item in items) {
yield return item;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)
And*_*are 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();
}
}
Run Code Online (Sandbox Code Playgroud)
如果要实现IEnumerable<T>泛型接口,则几乎总是必须使用通用的GetEnumerator方法 - 除非将对象显式转换为(非泛型)IEnumerable.
原因是.NET 1.0/1.1的后向兼容性不支持泛型.