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()の両方を実装する必要出てきて面倒ですよね。(^^;