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