如果集合或列表同时实现 IEnumerable<T> 和 IEnumerator<T>,那么 foreach 使用什么?
问问题
368 次
4 回答
5
IEnumerable<T>
有一个方法GetEnumerator
- 这将是一个IEnumerator<T>
,这是用于迭代的(使用MoveNext
方法)。
于 2012-10-03T18:35:52.087 回答
3
你根本不能使用 a foreach
on 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 回答