IEnumerator.Currentのドキュメントを検討してください。
また、MoveNext への最後の呼び出しがコレクションの終了を示す false を返した場合、Current は例外をスローします。
ただし、これは反復子ブロックでは発生しません。例えば:
void Main()
{
using (var enumerator = GetCounter().GetEnumerator())
{
for (int i = 0; i < 10; i++)
{
enumerator.MoveNext();
Console.WriteLine (enumerator.Current);
}
}
}
static IEnumerable<int> GetCounter()
{
for (int count = 0; count < 3; count++)
{
yield return count;
}
}
単純に 8 回出力2
され、例外はスローされません。コンパイラの変換を見ると、はCurrent
、常にフィールドの値を返すだけで、それ以上のものは何も返さない単純なフィールド バックアップ プロパティです。おそらく、それは何らかの形の最適化ですか?それでも、これは契約違反のように見えます。