【问题标题】:Does foreach prefer IEnumerable<T> or IEnumerator<T>foreach 更喜欢 IEnumerable<T> 还是 IEnumerator<T>
【发布时间】:2012-09-24 17:54:31
【问题描述】:

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

【问题讨论】:

    标签: c# foreach iterator


    【解决方案1】:

    IEnumerable&lt;T&gt; 有一个方法 GetEnumerator - 这将是一个 IEnumerator&lt;T&gt;,用于迭代(使用 MoveNext 方法)。

    【讨论】:

      【解决方案2】:

      您根本不能在IEnumerator&lt;T&gt; 上使用foreach

      您只能在具有GetEnumerator 方法的对象上使用foreach(无论它是否实现IEnumerable

      所以为了回答你的问题,它使用来自IEnumerable&lt;T&gt;GetEnumerator 方法。

      证明很简单。试着编译一下:

      IEnumerator<char> str = "asdf".GetEnumerator();
      foreach (char c in str) { }
      

      【讨论】:

      • 哦,我没注意到。认为 foreach 接受两者或直接更喜欢迭代器接口。谢谢你的回答。
      • ...因为下面和 Eric 的博客中描述的基于模式的“鸭子打字”而错过了这一点。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        另一个(更相关的)问题是:如果一个类型显式地实现了IEnumerable&lt;&gt; 并且同时有一个合适的常规公共方法GetEnumerator() 怎么办?答:那就用public方法吧。

        如果类型实现 both IEnumerable&lt;Foo&gt; IEnumerable&lt;Bar&gt; 会怎样?然后,如果没有常规的实例方法GetEnumerator()(如果两个接口都被显式实现,就会发生这种情况),就会出现编译时错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-17
          • 1970-01-01
          • 1970-01-01
          • 2015-11-19
          • 2017-04-26
          • 1970-01-01
          相关资源
          最近更新 更多