Подтвердить что ты не робот

С# возвращающая ошибка "не все пути кода возвращают значение"

Я пытаюсь написать код, который возвращает, делится ли данное целое равномерно на 1-20,
но я продолжаю получать следующую ошибку:

error 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;
        }
    }
}
4b9b3361

Ответ 1

Вам не хватает инструкции 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
}

Ответ 2

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

Вместо возврата в последнюю итерацию просто верните 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 суперплошной, так как это всегда верно, когда вы туда попали.

Ответ 3

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

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
}

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

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

Ответ 4

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

Прежде всего, проблема заключается в том, что не все условия вашей структуры управления были устранены. По сути, вы говорите, если a, то это, иначе, если b, то это. Конец. Но что, если и нет? Невозможно выйти (т.е. Не каждый "путь" возвращает значение).

Мое дополнительное замечание состоит в том, что это пример того, почему вы должны стремиться к одному выходу, если это возможно. В этом примере вы сделали бы что-то вроде этого:

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

return result;

Итак, здесь всегда есть оператор return, и метод всегда выходит в одном месте. Несколько вещей, которые следует учитывать, хотя... вам нужно убедиться, что ваше значение выхода действительно на каждом пути или, по крайней мере, приемлемо. Например, эта структура принятия решений учитывает только три возможности, но единственный выход также может выступать в качестве вашего последнего заявления. Или это? Вы должны убедиться, что окончательное возвращаемое значение действительно для всех путей. Это гораздо лучший способ приблизиться к ней, имея 50 миллионов точек выхода.

Ответ 5

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

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

}

Ответ 6

Взгляните на это. Это оператор Ternary в С#.

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

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

Ответ 8

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