考虑关于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
只是一个有后备字段支持的属性,它总是返回该字段的值而没有其他内容。也许这是某种形式的优化?尽管如此,这看起来像是违反了契约。