2

如果集合或列表同时实现 IEnumerable<T> 和 IEnumerator<T>,那么 foreach 使用什么?

4

4 回答 4

5

IEnumerable<T>有一个方法GetEnumerator- 这将是一个IEnumerator<T>,这是用于迭代的(使用MoveNext方法)。

于 2012-10-03T18:35:52.087 回答
3

你根本不能使用 a foreachon an IEnumerator<T>

您只能foreach覆盖具有GetEnumerator方法的对象(无论它是否实现IEnumerable.

因此,要回答您的问题,它使用GetEnumerator来自 的方法IEnumerable<T>

证明很简单。试着编译这个:

IEnumerator<char> str = "asdf".GetEnumerator();
foreach (char c in str) { }
于 2012-10-03T18:37:43.690 回答
1

另请注意,这不是集合实现 IEnumerable/IEnumerator 以便在 foreach 循环中使用的要求。Foreach 使用此处描述的基于模式的方法Eric Lippert 博客

于 2012-10-03T18:43:52.880 回答
1

另一个(更相关的)问题是:如果一个类型IEnumerable<>显式实现并且同时具有GetEnumerator()合适的常规公共方法怎么办?答:那么使用public方法。

如果该类型同时实现 IEnumerable<Foo> and IEnumerable<Bar>怎么办?然后,如果没有常规的实例方法GetEnumerator()(如果两个接口都显式实现,就会发生这种情况),就会出现编译时错误。

于 2012-10-03T19:44:02.300 回答