https://atmarkit.itmedia.co.jp/fdotnet/special/cs20review02/cs20review02_02.html
yield return を返すメソッドは、switch文を使ってメソッドの処理をyield return単位で分割実行するMoveNextを備えたイテレータオブジェクトを返すメソッドに変換される。
つまり yield return の挙動は、ローカル変数と現在の実行ステータスを保持したオブジェクトと、実行ステータスごとに分割して書かれた処理によって実現されている。
例えば以下のメソッドは……
public IEnumerator GetEnumerator() { for ( int i=1;i<=3;i++ ) { Console.WriteLine( "yield return {0}; ThreadID={1}", i,Thread.CurrentThread.ManagedThreadId ); yield return i; } }
以下のようなMoveNextメソッドを持つイテレータオブジェクトを返す。
bool MoveNext() { switch ( <>1__state ) { case 0 : goto IL_001f; case 1 : goto IL_0070; default: goto IL_0096; } IL_001f: <>1__state = -1; <i>5__1 = 1; // for( i=1;i<=3;i++ ) { goto IL_0086 IL_002f: Console.WriteLine( "yield return {0}; ThreadId={1}", <i>5__1, System.Threading.Thread.CurrentThread.ManagedThreadId ); <>2__current = <i>5__1; // yeild return i; <>1__state = 1; return true; IL_0070: <>1__state = -1; <i>5__1 ++; // end of for IL_0086: if( <i>5__1 <= 3 ) goto IL_002f; IL_0096: return false; }