C# - 如何创建不可检测的无限循环?

标签 c# loops infinite-loop

这只是一个“我很好奇”的问题。

在 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/

相关文章:

python - 如何在 Python 中循环输入?

r - R 中不再有循环

reactjs - React Hooks 无限循环与数组

c++ - 如果输入字母而不是数字,为什么会出现无限循环?

c# - 识别图像中的数字

c# - Azure 媒体服务 Assets 管理

c# - 有关常数的一般CS问题

c# - 将字符串或 NULL 插入 SQL Server 数据库时出现问题

arrays - 尝试使用循环创建具有不同值的字符串

recursion - 超出堆栈限制 (0.2Gb)...可能无限递归(循环):