IEnumerable、IEnumerator

示例1:

    class E
    {
        public IEnumerable MyGetEnumerator1()
        {
            yield return 1;
        }
        public IEnumerable<int> MyGetEnumerator2()
        {
            yield return 1;
            yield return 2;
        }
        public IEnumerator MyGetEnumerator3()
        {
            yield return 1;
            yield return 2;
            yield return 3;
        }
        public IEnumerator<int> MyGetEnumerator4()
        {
            yield return 1;
            yield return 2;
            yield return 3;
            yield return 4;
        }      
        public IEnumerator GetEnumerator()
        {
            yield return 1;
            yield return 2;
            yield return 3;
            yield return 4;
        }
    }


E e = new E();
foreach (var item in e.MyGetEnumerator1())            
    Console.WriteLine(item);

foreach (var item in e.MyGetEnumerator2())
    Console.WriteLine(item);

//报错:foreach statement cannot operate on variables of type 'IEnumerator' because 'IEnumerator' does not contain a public instance or extension definition for 'GetEnumerator'
foreach (var item in e.MyGetEnumerator3())  
    Console.WriteLine(item);

//报错:同上
foreach (var item in e.MyGetEnumerator4())  
    Console.WriteLine(item);

//当GetEnumerator()的返回类型为IEnumerator或IEnumerator<int>时都能正常运行,当为IEnumerable或IEnumerable<int>时,则报错:1、'IEnumerable' does not contain a definition for 'Current',2、foreach requires that the return type 'IEnumerable' of 'E.GetEnumerator()' must have a suitable public 'MoveNext' method and public 'Current' property
foreach (var item in e)  
     Console.WriteLine(item);

总结:

  1、当方法的返回类型为 IEnumerable 或为其泛型的时候,方法名可以为任意名称,并在foreach中使用 类型.方法的形式进行调用,如:

   foreach (var item in e.MyGetEnumerator1())            
       Console.WriteLine(item);

  2、当方法的返回类型为 IEnumerator 或为其泛型的时候,方法名只能为 GetEnumerator,并在foreach中使用 类型 的形式进行调用,如:

foreach (var item in e)  
    Console.WriteLine(item);

   3、yield return 语句的返回类型可以是:IEnumerable 、 IEnumerable<T> 、IEnumerator、  IEnumerator<T>

posted @ 2024-09-28 21:17  竹楼风雨声  阅读(18)  评论(0)    收藏  举报