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;
}