C#のforeach文の展開について

C#のforeach文は配列をはじめ、列挙子やリストなどのさまざまなシーケンシャルな反復処理を簡潔に書くことができます。

このforeach文はコンパイル時に以下のようなコードに展開されます。

展開されたコードを見ると、collectionはGetEnumerator()メソッドを実装している必要がありそうです。
また、GetEnumerator()メソッドの戻り値型であるEはMoveNext()メソッドとenumerator.Currentプロパティを実装している必要がありそうです。

実際にこのような仕様になっています。

たとえば、フィボナッチ数列を表すクラスは以下のように実装すればforeach文で扱うことが出来ます。

■ソースコード

■実行結果

クラスの実装はやや手間がかかるかと思いますが、一度実装してしまえばこちらのものです。
ライブラリでもforeach文での使用が可能なクラスはたくさん有るので、どのような実装になっているか調べてみるのも面白いかもしれません。

■参考サイト
8.8.4 foreach ステートメント