http://blog.csdn.net/byondocean/article/details/6871881

解决方案 »

  1.   

    要想满足 foreach 语句的使用,其实是不需要 IEnumerable 接口的,只要提供一个 GetEnumerator 方法就可以。你可以把那个接口从 People类中去掉看看。这肯定是为了与早先的某些设计想兼容(虽然现在已经很难看出为什么还要维系这种东西了)。可以看出来,编译器在处理 foreach 语法时 考虑 IEnumerator 接口的方案是随后加上去的设计。你可以把 PeopleEnum GetEnumerator() 方法去掉而仅留下IEnumerable  接口看看。msdn的这个例子不好。它弄了个“四不像”的东西,两种支持foreach编译的写法全都提供了,结果必有一种是“多余的”!
      

  2.   


    谢谢分享,大概了解了IEnumerable接口的用法原理。
      

  3.   


    要满足foreach语句的使用有两种方法:
    方案1:这个类有一个public的GetEnumerator的实例方法,并且返回类型中有public 的bool MoveNext()实例方法和public的Current实例属性。
    方案2:让这个类实现IEnumerable接口.我们来看方案二:
    我们只需要在People类中实现这样一个方法:
    public IEnumerator GetEnumerator()
    {
        return new PeopleEnum(_people);
    }
    但是MSDN例子中的这个方法感觉很困惑:
    IEnumerator IEnumerable.GetEnumerator()
    {
       return (IEnumerator) GetEnumerator();
    }没有public限定,函数名成了IEnumerable.GetEnumerator?
      

  4.   

    实现一个接口中的方法,不需要为方法声明为 public 的。private、protected、internal等等也都可以。实现一个接口的方法,写成“接口名.方法”也是可以的,编译器会优先认识到这个签名的方法才是用来实现接口的。这也没有什么。
    msdn的例子,关键的问题是,虽然它给你示例 IEnumerable 的用法,但是这个东西毫无作用,你设置断点之后可能会发现它从来也不执行。因此它是应该可以被删除的例子。