如果集合或列表同时实现IEnumerable< T>,则foreach会使用什么?和IEnumerator< T>?
答案 0 :(得分:5)
IEnumerable<T>
有一个方法GetEnumerator
- 这将是IEnumerator<T>
,这是用于迭代的方法(使用MoveNext
方法)。
答案 1 :(得分:3)
您根本无法在foreach
上使用IEnumerator<T>
。
您只能foreach
覆盖具有GetEnumerator
方法的对象(无论是否实现IEnumerable
。
因此,要回答您的问题,请使用GetEnumerator
中的IEnumerable<T>
方法。
证明这很简单。试着编译一下:
IEnumerator<char> str = "asdf".GetEnumerator();
foreach (char c in str) { }
答案 2 :(得分:1)
另请注意,这不是集合实现IEnumerable / IEnumerator以便在foreach循环中使用的要求。 Foreach使用此处描述的基于模式的方法Eric Lippert blog
答案 3 :(得分:1)
另一个(更相关)的问题是:如果类型明确地实现IEnumerable<>
并且同时具有适合的常规公共方法GetEnumerator()
,该怎么办?答:然后使用公共方法。
如果类型实现 IEnumerable<Foo>
和 IEnumerable<Bar>
怎么办?然后,如果没有常规实例方法GetEnumerator()
(如果两个接口都是显式实现的话可能会发生),则会出现编译时错误。