c# returning error " не все пути кода возвращают значение"

Я пытаюсь написать код, который возвращает, делится ли данное целое число равномерно на 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;
        }
    }
}

8 ответов


вы пропускаете 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
}

компилятор не получает сложную логику, в которой вы возвращаетесь в последней итерации цикла, поэтому он думает, что вы можете выйти из цикла и в конечном итоге ничего не возвращать.

вместо того, чтобы возвращаться в последней итерации, просто верните 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 был ненужным, так как это всегда верно, когда вы туда добраться.


Я также испытал эту проблему и нашел простое решение быть

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
}

Это также работает с другими типами возврата и дает наименьшее количество проблем

начальное значение, которое я выбрал, было резервным значением, и я смог повторно назначить значение столько раз, сколько требуется.


или просто сделайте это:

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

}

Мне нравится бить мертвых лошадей, но я просто хотел сделать дополнительный момент:

прежде всего, проблема в том, что не все условия вашей структуры управления были рассмотрены. По сути, вы говорите, если 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. Или нет? Необходимо убедиться, что конечное возвращаемое значение допустимо для всех путей. Это гораздо лучший способ приблизиться к нему по сравнению с 50 миллионами точек выхода.


взгляните на это. Это тернарный оператор в 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);
}

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 в зависимости от того, что true


Я получил эту ошибку при попытке открыть проект VS 2017 в VS 2015. Конечно, решение должно было открыться в 2017 году.