イテレータを解剖する C#における yield return の実体

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