IEnumerable 用于foreach
IEnumerator  用于while(xxx.MoveNext())
明白了没。两个不一样。

解决方案 »

  1.   

     foreach (string s in arrperson) 这个只会调用 GetEnumerator() 这个方法不会调用 getnum()
    明白了没。
      

  2.   

    你去看下IEnumerable接口的定义,你再试试把GetEnumerator()函数删除是否会报错。GetEnumerator()是必须有的,而getnum()是可有可无的,foreach遍历只会使用必须存在的而不是可有可恶的方法,不是看返回值类型符合就会去用,而是看是否满足接口的规范。
      

  3.   

    那请问下如果要结合foreach调用getnum()函数该怎么写呢?我写的:foreach (string s in arrperson.getnum())报错!
      

  4.   


    哎,你到底有没有看明白所有的回复呢?你的getnum()返回的对象实现了IEnumerable接口了吗?它不过是实现了IEnumerator接口而已好不好?!
      

  5.   


    嗯,试了一下确实如此,这是语法糖,确实不需要 IEnumerable 接口。public class person
    {
        public A getnum()
        {
            return new A();
        }
    }public class A
    {
        public System.Collections.IEnumerator GetEnumerator()
        {
            yield return "dshdjs";//为什么没有输出这个??
        }
    }这可以支持  foreach (string s in arrperson.getnum()) 操作
      

  6.   


    getnum()返回的对象需要具有一个返回相应类型的 GetEnumerator() 方法,这是在语法上这样规定的。
      

  7.   


    嗯,试了一下确实如此,这是语法糖,确实不需要 IEnumerable 接口。public class person
    {
        public A getnum()
        {
            return new A();
        }
    }public class A
    {
        public System.Collections.IEnumerator GetEnumerator()
        {
            yield return "dshdjs";//为什么没有输出这个??
        }
    }这可以支持  foreach (string s in arrperson.getnum()) 操作
    这是有历史原因的,为了支持数组等运行时添加扩展方法的类,不得已违背了接口的模式,但是通过接口来定义能更加清晰自己必须要实现的方法。
      

  8.   

    GetEnumeratorz就是给这个继承的集合赋值!
    这样就输出所有的值了!           person arrperson = new person();
                System.Console.WriteLine(arrperson.x);
                foreach (string s in arrperson)
                {
                    System.Console.WriteLine(s);
                }
                foreach (string s in arrperson.getnum())
                {
                    System.Console.WriteLine(s);
                }
                System.Console.ReadLine();