这只是一个“我很好奇”的问题。
在 C#-in-depth 中,Jon Skeet 谈到了 lambda 表达式:
“如果存在非空返回类型,则每个代码路径都必须返回兼容的值。”(第 233 页)
然后脚注说:
“当然,抛出异常的代码路径不需要返回值,可检测的无限循环也不需要。”(第 233 页)
我想知道什么是不可检测的无限循环?
仅凭逻辑能做到这一点吗?还是通过使用数据库或文件系统等外部因素来完成?
最佳答案
Jon 所指的内容在规范的第 8.1 节中有所描述。编译器只能检测非常简单的无限循环,例如:
while(true) { if (0 != 0) return 123; }
编译器足够聪明,可以看到返回永远不会到达,因此循环将永远运行。这是合法的,虽然疯狂,说:
int M() { while(true) { } }
因为虽然没有返回 int 的路径,但也没有返回而不返回 int 的路径!
编译器不够智能,无法找到其他类型的无限循环。例如:
int x = 123;
while(true) { if (x * 0 != 0) break; }
这显然是一个无限循环。但是编译器不知道。编译器说“好吧,也许 x 有一些值,其中 x * 0 不为零,所以中断是可到达的,所以这不是无限循环”。你我都知道这是不可能的,因为我们懂数学,但编译器不懂。
如果需要详细信息,请阅读第 8.1 节。
关于C# - 如何创建不可检测的无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2313150/