イテレーターは、.NETプログラミングの中核である。実際にデベロッパは索引付きデータに対して作業することは極めてまれであり、たいていの作業で for-each ループを好んで使用している。しかし、ますますマルチスレッドアプリケーションに頼りつつある中で、本質的にこのシーケンシャアクセス方式は適切なのか?
Bill McCarthy氏(リンク)は以下のように書いている。
イテレーターの主なタスクを次のエレメントの取得であると考えているならば、それをおこなう様子を見てみるとよい。決定的な設計上の欠陥Iがあることに気 づくだろう。操作はアトミックではない。イテレーターの実装はIEnumeratorもしくはIEnumerator(Of T)であり、そしてIEnumeratorはまず最初にMoveNextを呼び出し、Currentプロパティを読み取ることを要求する。複数のスレッドが同一のIEnumeratorを使用することを許可すると、MoveNext、MoveNext、 Current、Currentのような呼び出しシーケンスがあり、1つの項目をスキップし、次を繰り返す。そういうわけで、IEnumeratorはス レッドには適さない。これは良く知られた設計上の制限であるが、それに対処するよりもC#のような言語がそれぞれのイテレーターを実装して、スレッドごと に別々のイテレーターになるようにした。それが、制限を認識しているだけでなく、それを実施している理由である。
Bill氏は、複数のスレッドを適切にサポートするために、新たなIEnumeratorがどのようにして動作すべきかについて、注釈をつけている。