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>

浙公网安备 33010602011771号