最も単純なケース(廃棄などなし)では、次を使用できます。
var enumerator = Items.GetEnumerator();// `var` to take advantage of more specific return type
while(enumerator.MoveNext())
{
Item item = enumerator.Current;
...
}
正確なルールについては、C#仕様8.8.4foreachステートメントを確認してください。
フォームのforeachステートメント
foreach (V v in x) embedded-statement
次に、次のように展開されます。
{
E e = ((C)(x)).GetEnumerator();
try {
V v;
while (e.MoveNext()) {
v = (V)(T)e.Current;
embedded-statement
}
}
finally {
… // Dispose e
}
}
(C#言語仕様バージョン4.0から引用)
ここで使用するタイプは、「コレクションタイプC
、列挙型タイプE
、および要素タイプT
」です。E
はのリターンタイプでありGetEnumerator
、必ずしもダックタイピングを使用してIEnumerator<V>
いるためではありません。foreach
仕様には、いくつかのコーナーケースとこれらのタイプを推測する方法も記載されていますが、これらの詳細はおそらくここでは関係ありません。
C#5では、の宣言がループにv
移動され、while
より直感的なクロージャーセマンティクスが取得されます。