foreachの展開
Array(の派生)クラスはforに展開されるんですね。気づきませんでした。(^^;
using System; using System.Collections; static class Program { static void Main () { int[] arr = { 1, 3, 5, 7, 9}; foreach (int n in arr) Console.WriteLine (n); // foreachは全てこのように展開されると思っていたけど IEnumerator e = arr.GetEnumerator (); while (e.MoveNext ()) Console.WriteLine (e.Current); // Arrayクラスはforに展開されるみたい for (int i = 0; i < arr.Length; ++i) Console.WriteLine (arr [i]); } }
あと、foreachはIEnumerableインタフェースから派生しなくてもGetEnumeratorメソッドさえあれば良いんですね。これも気づきませんでした。(^^;
using System; using System.Collections.Generic; class Foo { public IEnumerator<int> GetEnumerator () { for (int i = 0; i < 10; ++i) yield return i; } } class Program { static void Main () { foreach (int n in new Foo ()) Console.WriteLine (n); } }
もし、IEnumerableインタフェースが必須だったら、IEnumerable<T>がIEnumerableから派生しているので、
using System; using System.Collections; using System.Collections.Generic; class Foo : IEnumerable<int> { public IEnumerator<int> GetEnumerator () { for (int i = 0; i < 10; ++i) yield return i; } IEnumerator IEnumerable.GetEnumerator () { for (int i = 0; i < 10; ++i) yield return i; } }
IEnumerable.GetEnumerator()とIEnumerable<T>.GetEnumerator()の両方を実装する必要出てきて面倒ですよね。(^^;