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

问题描述 投票:0回答:10

我正在尝试编写返回给定整数是否可以被 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;
        }
    }
}
c# return code-analysis
10个回答
120
投票

您缺少

return
声明。

当编译器查看您的代码时,它会看到可能发生但不返回值的第三条路径(您没有为其编写代码的

else
)。 因此
not all code paths return a value

对于我建议的修复,我在循环结束后放置了

return
。 另一个明显的点 - 将具有
else
值的
return
添加到
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
}

11
投票

编译器无法获取您在循环的最后一次迭代中返回的复杂逻辑,因此它认为您可以退出循环并最终根本不返回任何内容。

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

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

注,原代码存在逻辑错误。您正在检查最后一个条件中的 if

num == 20
,但您应该检查 if
j == 20
。还要检查
num % j == 0
是否多余,因为当你到达那里时总是如此。


9
投票

我也遇到过这个问题,发现简单的解决方案是

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
}

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

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


7
投票

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

首先,问题是控制结构的所有条件并未得到解决。本质上,你是说如果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
投票

或者简单地做这些事情:

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; 
      }
   }
}

1
投票

看看这个。它是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);
}

1
投票
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();
    }
}

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


0
投票

如果我放错了 return 语句,通常会发生这种情况,例如: enter image description here

添加 return 语句,或者在我的例子中,将其移动到正确的范围即可解决问题: enter image description here


0
投票

并非所有代码路径都会返回值。

解决方案:要解决该错误,请确保从函数中的所有代码路径返回一个值,或者在 tsconfig.json 文件中将 noImplicitReturns 设置为 false。


0
投票
    public class Customer Repository
{
public Customer Retrieve(int customerID)
{
    //Create the instance of the Customer class //Pass in the requested ID
    Customer customer = new Customer(customerID);
    //Code for retrieving the defined customer
    //Temporary hard-coded values to return //Example of a populated customer if (customerID == 1)
    {
        customer.EmailAdrress = "[email protected]";
        customer.FirstName = "Bobo";
        customer.LastName = "Smard";
        return customer;
    }
    public bool Save(Customer customer)
    {
        return true;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.