C# 为什么在这种情况下编译器不';你不抱怨吗?

C# 为什么在这种情况下编译器不';你不抱怨吗?,c#,compiler-errors,C#,Compiler Errors,代码如下: private TreeNode GetTopLevelNode(TreeNode childNode) { if (childNode == null) throw new ArgumentNullException("childNode", "childNode is null."); if (childNode.Parent == null) return childNode; TreeNod

代码如下:

 private TreeNode GetTopLevelNode(TreeNode childNode)
    {
        if (childNode == null)
            throw new ArgumentNullException("childNode", "childNode is null.");

        if (childNode.Parent == null) return childNode;

        TreeNode node = childNode;
        while (true)
        {
            if (node.Parent == null)
            {
                return node;
            }
            node = node.Parent;
        }

    }
在while循环中,只有当node.Parent==null时,才会返回一个节点

为什么编译器不报告“并非所有代码路径都返回值”错误

如果无法满足'node.Parent==null',则不会返回任何树节点。
编译器无法检测到这种情况?

因为您正在使用
while(true){
,除了使用返回,没有其他方法可以退出循环。如果不能满足
node.parent==null
,那么它将是一个无限循环。因此,没有返回就无法通过循环,编译器也不会抱怨

另外,您指定的代码几乎总是返回null
TreeNode
,这是您真正想要的吗


编辑:我看你已经修复了。

编译器很聪明,可以优化循环。它知道唯一的解决方法是在
条件返回
true
后返回,除非你有无限深度循环,否则while将永远继续


因此,要么循环被卡住,要么在某一点父循环将为null。它在while之后永远不会进入,因为它不会结束。

编译器意识到,在它将终止的所有情况下,函数将返回一个
TreeNode
。在函数返回的所有情况下,它将返回一个正确的值。因此,在将返回一个未定义的值,并且编译器没有看到警告的理由


如果函数没有返回,就没有必要去怀疑返回值。

你的问题实际上是计算机科学中最深刻、最有趣的问题之一。这个问题被称为停止问题:给定一个程序,确定它是总是返回还是永远运行的问题

停止问题之所以著名,是因为计算机无法证明它是可解的。没有任何算法可以可靠地告诉你给定的程序是否停止。你可以证明这样的程序要么(1)给出错误的答案,(2)无法分析所有程序,要么(3)它本身有时从不停止


因此,C#编译器并不试图解决停止问题。相反,我们只是检测到“while(true)”和缺少中断意味着循环永远不会被“排除在底部”,因此方法的终点是不可到达的。错误“并非所有代码路径都返回值”实际上意味着“存在一个退出方法但不返回值的代码路径”。这并不意味着“存在一个永远运行的代码路径”“--因为解决这个问题需要解决暂停问题。

我认为您的代码中有一个错误:在while循环中:您不应该返回节点而不是节点。Parent?@Tommy,谢谢您指出