.NETのYieldが何をしているか

.NETのYieldがどんなふうにILを出力してるんか調べてみた
VBだけ調べたけどC#も多分一緒だろう
割とcall/ccするのめんどいな

1. Yieldの付いた関数毎にIEnumeratorなクラスを作る、とりあえずStateMachineと呼ぶ
2. Yieldの付いた関数の引数、ローカル変数を全部メンバ変数に持つ
3. 戻り値と状態もメンバ変数に持つ
4. Yieldの出現箇所にユニークな連番を振る
5. Yieldしている個所の前で次のことをする
・Yieldの値を戻り値のメンバ変数に入れる
・4.で付けたユニークな番号を状態のメンバ変数に入れる
・Return Trueしとく
・Returnの後にユニークな番号に対応したラベルを張る
6. 関数を抜けるときに次のことをする
・最終行でっせというラベルを張る
・状態のメンバ変数に最終行でっせという値を入れる
・Return Falseする

' 呼び出し側
For Each x In Cdr(xs)
    ' なんか処理
Next

Public Shared Iterator Function Cdr(xs As List(Of Integer))
	For i = 1 To xs.Count - 1
		Yield xs(i)
	Next
End Function' 呼び出し側
For Each x In New StateMachine With {._xs = xs}
    ' なんか処理
Next

' Yieldの関数展開結果
Class StateMachine
	Implements IEnumerator

	Private _i As Integer
	Private _xs As List(Of Integer)
	
	Private _value As Integer
	Private _state_machine As Integer = 0
	
	Public ReadOnly Property Current() As Boolean
		Get
			Return _value
		End Get
	End Property
	
	Public Function MoveNext() As Boolean
		
		If _state_machine = 1 Then Goto __STATE1
		If _state_machine = 2 Then Goto __STATE2
		
		_i = 1
		Do While _i <= _xs.Count - 1
			
			_value = _xs(_i)
			_state_machine = 1
			Return True
			__STATE1:
			
			_i += 1
		Loop
		
		__STATE2:
		_state_machine = 2
		Return False
	End Function
End Class

簡単にcdrするILの関数書きたいだけなんだけど難しいなー・・・