【发布时间】:2011-02-13 23:06:53
【问题描述】:
“无限”IEnumerable 的一个简单示例是
IEnumerable<int> Numbers() {
int i=0;
while(true) {
yield return unchecked(i++);
}
}
我知道,那
foreach(int i in Numbers().Take(10)) {
Console.WriteLine(i);
}
和
var q = Numbers();
foreach(int i in q.Take(10)) {
Console.WriteLine(i);
}
两者都可以正常工作(并打印出数字 0-9)。
但是在复制或处理q 之类的表达式时有什么陷阱吗?我可以相信他们总是被评价为“懒惰”的事实吗?产生无限循环有什么危险吗?
【问题讨论】:
-
只是为了挑剔,当 i = Int32.MaxValue 并且您执行 i++ 时,您的“无限”示例不会抛出异常吗?还是循环到 Int32.MinValue?嗯.....
-
你是对的。它可能会引发溢出异常......我会编辑它。
-
只是在这里挑剔,您的观点仍然存在。 :) 另外,我试过了,它确实循环到 Int32.MinValue。没有OverflowException,所以它实际上是一个无限循环。
-
C# 默认编译时不进行溢出检查。安全的方法总是写 unchecked(i++) 因为你可以用 /checked 编译,然后它会吐。使用 unchecked() 告诉编译器即使使用 /checked 编译也会发生溢出。
-
比回到原版更漂亮:D
标签: c# enumeration infinite-loop yield-return