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); //當(dāng)GetEnumerator()的返回類型為IEnumerator或IEnumerator<int>時都能正常運行,當(dāng)為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);
總結(jié):
1、當(dāng)方法的返回類型為 IEnumerable 或為其泛型的時候,方法名可以為任意名稱,并在foreach中使用 類型.方法的形式進(jìn)行調(diào)用,如:
foreach (var item in e.MyGetEnumerator1()) Console.WriteLine(item);
2、當(dāng)方法的返回類型為 IEnumerator 或為其泛型的時候,方法名只能為 GetEnumerator,并在foreach中使用 類型 的形式進(jìn)行調(diào)用,如:
foreach (var item in e) Console.WriteLine(item);
3、yield return 語句的返回類型可以是:IEnumerable 、 IEnumerable<T> 、IEnumerator、 IEnumerator<T>

浙公網(wǎng)安備 33010602011771號