インターフェース:IEnumerator

if に続く条件式 dict != null が成立しないなら、引数 b によって参照されるものは、汎用のインターフェース IEnumerator で規定したプロトコルに従ってアクセスします。そこで、メソッド本体を見ると、次に示す典型的な C# のイディオムが記述してあります。

    IEnumerator i = Ops.GetEnumerator(b);
int index = 0;
while (i.MoveNext()) {
if (!AddKeyValue(self, i.Current)) {
throw Ops.ValueError("dictionary update sequence element #{0} has bad length; 2 is required", index);
}
index++;
}

ここでは、引数 b からどのようにして IEnumerator が得られるか(how)は知らなくても、それを使ってなにをしたいか(what)を理解できれば、十分です。b の各要素を参照したいときに、Ops.GetEnumerator を利用するだけです。
局所変数 index は、エラーメッセージを補足する情報として、引数の位置を保持します。これによって、何番目の引数に問題があるかを明らかにします。
インターフェース IEnumerator で規定したプロトコルに従って、各要素 i を順に参照します。(次に示す)補助関数 AddKeyValue を使って、メソッド呼び出し dict.update の対象となるインスタンス self に対して、要素対 i.Current(キー:値)を追加します。ただし、要素対を追加できないときには、例外 Ops.ValueError を生成して、エラーメッセージを出力します。