的IEnumerable 提供了两种方法的GetEnumerator - 它们之间有什么区别呢?
-
05-09-2019 - |
题
当我emplement IEnumerable<T>
接口I看到两个GetEnumerator
方法:一种返回IEnumerator
等IEnumerator<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
不是很大的兴趣(或只是未知)来完成。
在一个是通用的,而另一个不是。我相信,编译器更喜欢使用通用过载。
不隶属于 StackOverflow