本帖最后由 jxfinest 于 2013-11-08 02:37:59 编辑

解决方案 »

  1.   

    代码一改成这样也行,这到底是怎么回事?
    public IEnumerator   GetEnumerator()
                {
                return    this.names.GetEnumerator();
                    //for (int i = 0; i < names.Length; i++)
                    //{
                    //    yield return names[i];//返回迭代器
                    //}
                }
      

  2.   

    是这样的,如果要对一个对象使用foreach,那么它必须包含一个GetEnumerator()方法,无参数,返回类型任意,同时返回的类型必须包含Current属性和MoveNext方法。编译器会自动去绑定,因此不需要IEnumerable和IEnumerator。其实接口的本质就是让编译器去绑定一个对象的方法,在这里,C#编译器的确不依赖接口。下面的代码不使用IEnumerable和IEnumerator:using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;namespace ConsoleApplication1
    {
        class Program
        {
            public class D9TecMembers
            {
                public class DefaultEnumerator
                {
                    private string[] value;
                    private int n = 0;
                    public DefaultEnumerator(string[] value) { this.value = value; }
                    public object Current
                    {
                        get { return value[n]; }
                    }                public bool MoveNext()
                    {
                        return ++n < value.Length;
                    }
                }            string[] names = { "Wei Gao", "Zhao Zhang", "Changji Song", "Zhike Chang", "Denian Zhang", "Zhaotian Yang", "Guangyue Cai" };
                
                public DefaultEnumerator GetEnumerator()
                {
                    return new DefaultEnumerator(names);
                }
            }        static void Main(string[] args)
            {
                D9TecMembers titles = new D9TecMembers();            foreach (string title in titles)
                {
                    Console.WriteLine(title);
                }
            }
        }
    }至于yield,则是C#编译器自动为你产生两个类,一个包含GetEnumerator,一个包含Current和MoveNext
      

  3.   

    本帖最后由 caozhy 于 2013-11-08 03:14:54 编辑
      

  4.   

    版主有空多如此讲解下.net基础理论,对很多人都是强大的帮助啊。
    PS:详细讲解后,不要忘了推荐加精,让更多人看到。
      

  5.   

    IEnumerable:可枚举的
    IEnumerator:枚举器
    根本不是一个东西,不能用来比较,微软的语法糖让你可以混合使用,但完全不是一个东西。
      

  6.   

    一个是枚举数,一个是可枚举类型。不能够一起看的,应该分开看。
    枚举数,是foreach的基本迭代器。而可枚举类型是可以返回枚举数的基础。
    枚举数,是可以自己设计的,也就是说是可以自己继承后再处理的。
      

  7.   

    大大可能笔误了:
    private int n = 0;改为private int n = -1;