【问题标题】:In what a case won't this function return a value? Why does the compiler report an error?在什么情况下这个函数不会返回一个值?为什么编译器会报错?
【发布时间】:2011-09-25 12:30:37
【问题描述】:
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)说“并非所有代码路径都返回值”。为什么?

【问题讨论】:

  • 您好,我编辑了您的帖子以显示所有代码。在 StackOverflow 中,您只需 1. 使用四个空格缩进任何代码,或者 2. 完成后突出显示您的代码并单击 {} 按钮。 (我想你的代码被&lt;&gt; 字符赶上了。)
  • 为什么n和0之间的运算符不见了?
  • 为什么要麻烦最后一个比较(n>0)?如果达到那个点,它显然会 > 0,所以跳过冗余比较,如果达到那个点就返回 3。
  • 另外,我想你理论上可以在函数期间改变'n'的值,即使你不这样做,编译器也不能保证?...

标签: c# .net if-statement return


【解决方案1】:

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

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

只要让最终的回报无条件。

【讨论】:

  • Jon Skeet -> Eric Lippert -> Alan Turning -> 停机问题
【解决方案2】:

编译器没有查看您的条件。即使您认为至少有一个 if 块将运行是正确的,但您仍然需要重构为如下内容:

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

【讨论】:

    【解决方案3】:

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

    您可以将所有if 语句与else 链接并仅将else 用于最后一个条件,或者您可以在最后返回一个默认值。这将解决问题。

    【讨论】:

    【解决方案4】:

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

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-04
      • 1970-01-01
      • 2017-02-11
      • 2015-01-05
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多