【问题标题】:C# compiler error: "not all code paths return a value"C# 编译器错误:“并非所有代码路径都返回值”
【发布时间】:2014-02-07 11:06:39
【问题描述】:

我正在尝试编写返回给定整数是否可被 1 到 20 整除的代码,
但我不断收到以下错误:

错误 CS0161:“ProblemFive.isTwenty(int)”:并非所有代码路径都返回值

这是我的代码:

public static bool isTwenty(int num)
{
    for(int j = 1; j <= 20; j++)
    {
        if(num % j != 0)
        {
            return false;
        }
        else if(num % j == 0 && num == 20)
        {
            return true;
        }
    }
}

【问题讨论】:

  • 您的代码没有意义,但错误信息很清楚。即使您的 if 条件在 20 次迭代中都为假,您也需要返回一个值。
  • 您像人类一样思考,而不是编译器。编译器不知道你在想什么,或者逻辑应该如何流动(过去的优化)。如果一个值不匹配任何一个“if”会发生什么?

标签: c# return code-analysis


【解决方案1】:

或者干脆做这些事情:

public static bool isTwenty(int num)
{
   for(int j = 1; j <= 20; j++)
   {
      if(num % j != 0)
      {
          return false;
      }
      else if(num % j == 0 && num == 20)
      {
          return true;
      }
      else
      {
          return false; 
      }
   }
}

【讨论】:

  • 这“破坏”了 OP 代码的(非常可疑的)逻辑,因为它总是会在循环的第一次迭代时返回。
【解决方案2】:

我喜欢打死马,但我只是想补充一点:

首先,问题在于控制结构的所有条件都没有得到解决。本质上,你是说如果 a,那么这个,否则如果 b,那么这个。结尾。但如果两者都不是呢?没有办法退出(即不是每个“路径”都返回一个值)。

我要补充的一点是,这是一个示例,说明了为什么您应该尽可能以单一出口为目标。在此示例中,您将执行以下操作:

bool result = false;
if(conditionA)
{
   DoThings();
   result = true;
}
else if(conditionB)
{
   result = false;
}
else if(conditionC)
{
   DoThings();
   result = true;
}

return result;

因此,在这里,您将始终有一个 return 语句,并且该方法始终在一个地方退出。不过需要考虑几件事......您需要确保您的退出值在每条路径上都有效或至少可以接受。例如,这个决策结构只考虑了三种可能性,但单一出口也可以作为你的最终 else 语句。或者是吗?您需要确保最终返回值在所有路径上都有效。与拥有 5000 万个退出点相比,这是一种更好的方法。

【讨论】:

    【解决方案3】:

    如果我放错了 return 语句,这通常会发生在我身上,例如:

    添加一个 return 语句,或者在我的情况下,将它移动到正确的范围将起到作用:

    【讨论】:

    • 使用文字代码而不是图像总是更好 - 如果视力受损的用户正在使用该网站,他们不能使用 TTS 阅读此答案,但如果您将代码复制为文本,他们可以.
    【解决方案4】:
    class Program
    {
        double[] a = new double[] { 1, 3, 4, 8, 21, 38 };
        double[] b = new double[] { 1, 7, 19, 3, 2, 24 };
        double[] result;
    
    
        public double[] CheckSorting()
        {
            for(int i = 1; i < a.Length; i++)
            {
                if (a[i] < a[i - 1])
                    result = b;
                else
                    result = a;
            }
            return result;
        }
    
        static void Main(string[] args)
        {
            Program checkSorting = new Program();
            checkSorting.CheckSorting();
            Console.ReadLine();
        }
    }
    

    这应该可以,否则我会收到并非所有代码路径都返回值的错误。因此,我将结果设置为返回值,根据哪个为真,将其设置为 B 或 A

    【讨论】:

      【解决方案5】:

      我也遇到过这个问题,找到了简单的解决方法

      public string ReturnValues()
      {
          string _var = ""; // Setting an innitial value
      
          if (.....)  // Looking at conditions
          {
              _var = "true"; // Re-assign the value of _var
          }
      
          return _var; // Return the value of var
      }
      

      这也适用于其他返回类型,并且问题最少

      我选择的初始值是一个备用值,我可以根据需要多次重新分配该值。

      【讨论】:

        【解决方案6】:

        看看这个。它是 C# 中的三元运算符。

        bool BooleanValue = (num % 3 != 0) ? true : false;
        

        这只是为了说明原理;您可以根据问号左侧的结果返回 True 或 False(甚至整数或字符串)。不错的接线员,这个。

        三个选项一起:

              public bool test1()
                {
                    int num = 21;
                    bool BooleanValue = (num % 3 != 0) ? true : false;
                    return BooleanValue;
                }
        
                public bool test2()
                {
                    int num = 20;
                    bool test = (num % 3 != 0);
                    return test;
                }
        

        更短:

        public bool test3()
        {
            int num = 20;
            return (bool)(num % 3 != 0);
        }
        

        【讨论】:

          【解决方案7】:

          您缺少return 声明。

          当编译器查看您的代码时,它会看到第三条路径(您未编写代码的else)可能会出现但不返回值。因此not all code paths return a value

          对于我建议的修复,我在循环结束后添加了 return。另一个明显的地方 - 将具有 return 值的 else 添加到 if-else-if - 会破坏 for 循环。

          public static bool isTwenty(int num)
          {
              for(int j = 1; j <= 20; j++)
              {
                  if(num % j != 0)
                  {
                      return false;
                  }
                  else if(num % j == 0 && num == 20)
                  {
                      return true;
                  }
              }
              return false;  //This is your missing statement
          }
          

          【讨论】:

          • 这会为isTwenty(44696171520) 返回错误的结果。它应该返回true,因为它可以被所有数字1到20整除,但它返回false。事实上,它总是返回false,因为它永远无法进入返回true的状态。
          • @Guffa - 我认为由于这个问题似乎是家庭作业,GlenH7 正在做最低限度的工作以在不修复逻辑错误的情况下编译代码。
          • 另一个可以揭示逻辑错误并帮助该学生学习的选项是抛出异常而不是返回潜在的错误值。
          • @Guffa - 我会有点不好意思地承认我没有尝试破译函数的其余部分,而是只关注 OP 提到的错误。我同样被 OP 的逻辑表达式难住了,但我选择忽略这一点,转而回答所提出的问题。
          【解决方案8】:

          编译器没有得到你在循环的最后一次迭代中返回的复杂逻辑,所以它认为你可以退出循环并最终什么都不返回。

          不是在最后一次迭代中返回,而是在循环后返回true:

          public static bool isTwenty(int num) {
            for(int j = 1; j <= 20; j++) {
              if(num % j != 0) {
                return false;
              }
            }
            return true;
          }
          

          旁注,原始代码中存在逻辑错误。您正在检查num == 20 是否在最后一个条件中,但您应该检查j == 20。还要检查 num % j == 0 是否是多余的,因为当您到达那里时总是如此。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-20
            • 1970-01-01
            • 1970-01-01
            • 2012-04-24
            相关资源
            最近更新 更多