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

C# C“编译器错误:”;并非所有代码路径都返回一个值";,c#,return,code-analysis,C#,Return,Code Analysis,我试图编写返回给定整数是否可被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; }

我试图编写返回给定整数是否可被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;
        }
    }
}
publicstaticboolstwenty(int-num)
{

对于(int j=1;j您缺少
return
语句

当编译器查看您的代码时,它会看到第三条路径(您没有为其编码的
其他路径
),该路径可能会出现,但不会返回值。因此
并非所有代码路径都会返回值

对于我建议的修复方法,我在循环结束后放置了一个
返回值
。另一个明显的点是,在
if else if
中添加一个
else
返回值的
将打破
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
}
publicstaticboolstwenty(int-num)
{

对于(int j=1;j,编译器无法获得在循环的最后一次迭代中返回的复杂逻辑,因此它认为可以退出循环,最终不返回任何内容

不要在最后一次迭代中返回,只需在循环后返回true:

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

对于(intj=1;j来看这个,它是C#中的三元运算符

这只是为了说明原理;根据问号左侧的结果,可以返回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);
}

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

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

我的另一点是,这是一个例子,说明了如果可能的话,为什么你应该以单一出口为目标。在这个例子中,你可以这样做:

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

return result;

所以,这里总是有一个返回语句,这个方法总是在一个地方退出。但是要考虑两件事……你需要确保你的出口值在每个路径上是有效的或者至少是可接受的。例如,这个决策结构只考虑三种可能性,但单出口也可以作为你最后的选择。语句。还是这样?您需要确保最终返回值在所有路径上都有效。这是一种比拥有5000万个退出点更好的方法。

或者简单地执行以下操作:

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; 
      }
   }
}
publicstaticboolstwenty(int-num)
{

对于(int j=1;j我也遇到了这个问题,并发现简单的解决方法是

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
}
这也适用于其他返回类型,并且问题最少

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

class Program
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();
    }
}
{ double[]a=新的double[]{1,3,4,8,21,38}; double[]b=新的double[]{1,7,19,3,2,24}; 双[]结果; 公共双[]检查排序() { for(int i=1;i

这应该可以工作,否则我会得到一个错误,即并非所有代码路径都返回一个值。因此,我将结果设置为返回值,根据哪个值为真,将其设置为B或a。如果我放错了return语句,这通常会发生在我身上,例如:

添加一个return语句,或者在我的例子中,将其移动到正确的作用域,就可以做到这一点:

您的代码没有意义,但错误信息非常清楚。即使在20次迭代中两个if条件都为false,您也需要返回一个值。您像人一样思考,而不是像编译器一样思考。编译器不知道您在想什么,也不知道逻辑应该如何流动(经过优化)。如果值与“if”或“if”不匹配,会发生什么情况?这将为
isTwenty(44696171520)返回错误的结果
。它应该返回
true
,因为它可以被所有数字1到20平分,但它返回
false
。事实上,它总是返回
false
,因为它永远不会进入返回
true
@Guffa的状态-我认为,因为这个问题似乎是GlenH7正在做的家庭作业e在不修复逻辑错误的情况下获得要编译的代码的最小值。另一个可以揭示逻辑错误并帮助该学生学习的选项是抛出一个异常,而不是返回一个可能错误的值。@Guffa-我有点不好意思地承认,我没有试图破译函数的其余部分,只是专注于OP提到的错误。我同样被OP的逻辑表达式难住了但我选择了忽略这一点,而选择回答被问到的问题。这“打破”了(极有疑问)OP代码的逻辑是,这将始终在循环的第一次迭代中返回。最好使用文字代码而不是图像-如果视力受损的用户正在使用该网站,他们不能使用TTS阅读此答案,但如果您以文本形式复制代码,他们可以。
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();
    }
}