C# 编译器错误:“并非所有代码路径都返回值”

Posted

技术标签:

【中文标题】C# 编译器错误:“并非所有代码路径都返回值”【英文标题】:C# compiler error: "not all code paths return a value" 【发布时间】: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”会发生什么? 【参考方案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 是否是多余的,因为当您到达那里时总是如此。

【讨论】:

以上是关于C# 编译器错误:“并非所有代码路径都返回值”的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 bool 方法上的“并非所有代码路径都返回值”?

获取异常“并非所有代码路径都返回值”

声明一个总是抛出异常的方法?

在一行上给出一串数字,用空格分隔

c# 8.0 switch 表达式返回类型和空值

当任何数学运算产生“NaN”时,如何强制 C# 编译器抛出异常?