在什么情况下这个函数不会返回值?为什么编译器报告错误?

时间:2011-06-29 21:14:02

标签: c# .net if-statement return

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)说“并非所有代码路径都返回一个值”。为什么呢?

4 个答案:

答案 0 :(得分:10)

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

有关编译器在可达性方面的限制的更多详细信息,请参阅this blog post from Eric Lippert

让最后的回报无条件。

答案 1 :(得分:8)

编译器没有查看您的条件。即使你是正确的,你的至少一个if-block会运行,你仍然需要重构这样的事情:

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

答案 2 :(得分:2)

编译器不够聪明,不知道所有这些分支是互斥的,所以它担心所有三个if语句都失败的秋天案例。

您可以将所有if语句与else相关联,仅使用else作为最后一个条件,也可以在结尾处返回默认值。这将解决问题。

答案 3 :(得分:1)

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

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
}