如何创建一个非

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

在C#中深入的Jon Skeet谈到了lambda表达式:
“如果有一个nonvoid返回类型,则每个代码路径必须返回一个兼容值。” (页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节,如果你想要的细节。


使用外部源创建无限循环,甚至滥用接口等工具都很麻烦。

例如:

  public interface INumbers
    {
        int GetNumber(int arg);
    }
    public class StaticNumber : INumbers
    {
        public int GetNumber(int arg)
        {
            return 1;
        }
    }
    public void DoStuff(INumbers num)
    {
        int i = 42;
        while ((i = num.GetNumber(i)) != 0)
        {
            ;
        }
    }

然后一个简单的

Action action = () => DoStuff(new StaticNumber());
链接地址: http://www.djcxy.com/p/80759.html

上一篇: How to create a non

下一篇: C#: How to test for StackOverflowException