【发布时间】:2013-10-28 19:33:04
【问题描述】:
考虑IEnumerator.Current的文档:
如果最后一次调用 MoveNext 返回,Current 也会引发异常 false,表示集合结束
但是,迭代器块不会发生这种情况。例如:
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,不会抛出异常。查看compiler transformation,Current 只是一个字段支持的属性,它总是返回字段的值,仅此而已。也许这是某种形式的优化?尽管如此,这看起来还是违反了合同。
【问题讨论】:
-
哦,我错过了!显然它已更改为“未定义”。我想这回答了我的问题,但我不能接受评论,所以请给出答案。
-
你可以回答你自己的问题。
标签: c# ienumerable yield-return