foreach是否更喜欢IEnumerable <t>或IEnumerator <t> </t> </t>

时间:2012-10-03 18:34:34

标签: c# foreach iterator

如果集合或列表同时实现IEnumerable&lt; T&gt;,则foreach会使用什么?和IEnumerator&lt; T&gt;?

4 个答案:

答案 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()(如果两个接口都是显式实现的话可能会发生),则会出现编译时错误。