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

Vac*_*ano 13 c# loops infinite-loop

这只是一个"我很好奇"的问题.

在C#-in-depth中,Jon Skeet谈到了lambda表达式:
"如果有一个非空的返回类型,则每个代码路径都必须返回一个兼容的值." (第233页)

然后脚注说:
"抛出异常的代码路径当然不需要返回值,也不会检测到无限循环." (第233页)

我想知道什么是不可检测的无限循环?

这可以通过逻辑完成吗?或者通过使用数据库或文件系统等外部因素来完成?

Eri*_*ert 21

Jon所指的是在说明书的8.1节中描述的.编译器只能检测非常简单的无限循环,例如:

while(true) { if (0 != 0) return 123; }
Run Code Online (Sandbox Code Playgroud)

编译器非常聪明,可以看到永远不会返回返回,因此循环将永远运行.说:虽然疯狂,但这是合法的:

int M() { while(true) { } }
Run Code Online (Sandbox Code Playgroud)

因为虽然没有路径返回一个int,也没有路径返回,而不返回一个int!

编译器不够智能,无法找到其他类型的无限循环.例如:

int x = 123;
while(true) { if (x * 0 != 0) break; }
Run Code Online (Sandbox Code Playgroud)

这显然是一个无限循环.但是编译器不知道这一点.编译器说"好吧,也许有一些x的值,其中x*0不为零,所以中断是可达的,所以这不是一个无限循环".你和我知道这是不可能的,因为我们知道数学,但编译器没有.

如果您需要详细信息,请阅读第8.1节.

  • 我实际上并不记得写这个 - 这表明脚注是由于你的影响:) (3认同)
  • @Jon:您最初写道"抛出异常的代码路径当然不需要返回值".我注意到可检测的无限循环也算作无法到达的终点. (2认同)
  • 对 - 这似乎更符合我们每个人想出的细节:) (2认同)