C#の戦闘能力を上げるため、昔購入したプログラム本を読み直しているけど、イテレータブロックがどうも理解できない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
using System; using System.Collections.Generic; namespace ConsoleApp1 { class Range { private int from, to; public IEnumerator<int> GetEnumerator() { for (int i = from; i <= to; i++) yield return i; } public Range(int from, int to) { this.from = from; this.to = to; } } class Program { static void Main(string[] args) { foreach (int i in new Range(0,9)) { Console.WriteLine("{0}", i); } Console.ReadLine(); } } } |
コンソールに0~9まで表示するという、まあ、意味のないコードなんだけど、RangeクラスのGetEnumeratorメッソドの働きが全く理解できない。
まず、インターフェースが戻り値ってどういうこと? それから、foreachの中では、Rangeクラスのインスタンスを生成するだけで、GetEnumeratorを呼んでいないのに0~9の値が返ってきている。
更に、GetEnumeratorのメッソド名を変えると構文エラーになる。
まあ、foreachでこういう風に使える..と丸暗記すればいいんだけど、なんかしっくりこないよなぁ..。