在什么情况下获胜;这个函数是否返回一个值?编译器为什么报告错误

本文关键字:一个 编译器 错误 报告 为什么 获胜 情况下 函数 返回 是否 在什么 | 更新日期: 2023-09-27 18:00:47

public static int Test(int n)
{
  if (n < 0) return 1;
  if (n == 0) return 2;
  if (n > 0) return 3;
}

编译器(Visual Studio 2010,C#4.0(表示"并非所有代码路径都返回值"。为什么?

在什么情况下获胜;这个函数是否返回一个值?编译器为什么报告错误

编译器不会试图确定这涵盖了n的所有可能值。它所看到的只是你有三个if语句,并且它假设所有都有可能是false。。。在这种情况下,您将在不返回值的情况下到达方法的末尾。

请参阅Eric Lippert的这篇博客文章,了解有关编译器可达性限制的更多详细信息。

最后无条件退货即可。

编译器没有查看您的条件。即使你认为至少有一个if块会运行是正确的,你仍然需要重构到这样的东西:

if (n < 0)
    return 1;
else if (n == 0)
    return 2;
else
    return 3;

编译器不够聪明,无法知道所有这些分支都是互斥的,因此它担心三个if语句都会失败。

您可以将所有if语句与else链接,并仅将else用于最后一个条件,也可以在末尾返回默认值。这将绕过这个问题。

编译器不知道您已经覆盖了所有的基础。你可以这样重写。。。

public static int Test(int n)
{
  if (n < 0) return 1;
  else if (n == 0) return 2;
  else (n > 0) return 3;
}

或者这个。。。

public static int Test(int n)
{
  if (n < 0) return 1;
  if (n == 0) return 2;
  if (n > 0) return 3;
  return 4; //will never occur
}
相关文章: