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
,那么它将是一个无限循环。因此,没有返回就无法通过循环,编译器也不会抱怨
另外,您指定的代码几乎总是返回nullTreeNode
,这是您真正想要的吗
编辑:我看你已经修复了。编译器很聪明,可以优化循环。它知道唯一的解决方法是在
条件返回true
后返回,除非你有无限深度或循环,否则while将永远继续
因此,要么循环被卡住,要么在某一点父循环将为null。它在while之后永远不会进入,因为它不会结束。编译器意识到,在它将终止的所有情况下,函数将返回一个TreeNode
。在函数返回的所有情况下,它将返回一个正确的值。因此,在将返回一个未定义的值,并且编译器没有看到警告的理由
如果函数没有返回,就没有必要去怀疑返回值。你的问题实际上是计算机科学中最深刻、最有趣的问题之一。这个问题被称为停止问题:给定一个程序,确定它是总是返回还是永远运行的问题
停止问题之所以著名,是因为计算机无法证明它是可解的。没有任何算法可以可靠地告诉你给定的程序是否停止。你可以证明这样的程序要么(1)给出错误的答案,(2)无法分析所有程序,要么(3)它本身有时从不停止
因此,C#编译器并不试图解决停止问题。相反,我们只是检测到“while(true)”和缺少中断意味着循环永远不会被“排除在底部”,因此方法的终点是不可到达的。错误“并非所有代码路径都返回值”实际上意味着“存在一个退出方法但不返回值的代码路径”。这并不意味着“存在一个永远运行的代码路径”“--因为解决这个问题需要解决暂停问题。我认为您的代码中有一个错误:在while循环中:您不应该返回节点而不是节点。Parent?@Tommy,谢谢您指出