#c# #.net #extension-methods
Вопрос:
Я пытаюсь написать код, который возвращает, делится ли данное целое число равномерно от 1 до 20,
но я продолжаю получать следующую ошибку:
ошибка CS0161: «ProblemFive.isTwenty(int)»: не все пути кода возвращают значение
Вот мой код:
public static bool isTwenty(int num) { for(int j = 1; j lt;= 20; j ) { if(num % j != 0) { return false; } else if(num % j == 0 amp;amp; num == 20) { return true; } } }
Комментарии:
1. Ваш код не имеет смысла, но сообщение об ошибке вполне понятно. Вам нужно вернуть значение, даже если оба ваших условия if являются ложными для 20 итераций.
2. Ты мыслишь как человек, а не как компилятор. Компилятор не знает, о чем вы думаете или как должна протекать логика (прошедшая оптимизация). Что произойдет, если значение не совпадает ни с одним из «если»?
Ответ №1:
Вы пропускаете return
заявление.
Когда компилятор просматривает ваш код, он видит третий путь ( else
для которого вы не кодировали), который может возникнуть, но не возвращает значение. Следовательно not all code paths return a value
.
Для моего предложенного исправления я ставлю a return
после того, как закончится ваш цикл. Другое очевидное место — добавление else
того, что имело return
значение if-else-if
, — разорвало for
бы цикл.
public static bool isTwenty(int num) { for(int j = 1; j lt;= 20; j ) { if(num % j != 0) { return false; } else if(num % j == 0 amp;amp; num == 20) { return true; } } return false; //This is your missing statement }
Комментарии:
1. Это возвращает неверный результат для
isTwenty(44696171520)
. Он должен вернутьсяtrue
, потому что его можно равномерно разделить на все числа от 1 до 20, но он возвращаетсяfalse
. На самом деле, он всегда возвращаетсяfalse
, потому что он никогда не сможет попасть в то состояние, в которое он вернулсяtrue
бы .2. @Guffa — Я думаю, что, поскольку этот вопрос, похоже, является домашним заданием, GlenH7 делал минимум, чтобы заставить код компилироваться без исправления логических ошибок.
3. Другим вариантом, который выявил бы логическую ошибку и помог бы этому студенту учиться, было бы создание исключения вместо возврата потенциально неправильного значения.
4. @Guffa — Я несколько застенчиво признаю, что не пытался расшифровать остальную часть функции и сосредоточился исключительно на ошибке, упомянутой в ОП. Я был в равной степени озадачен логикой операции, но я решил проигнорировать это в пользу ответа на заданный вопрос.
Ответ №2:
Компилятор не понимает сложной логики, в которой вы возвращаетесь на последней итерации цикла, поэтому он думает, что вы можете выйти из цикла и в конечном итоге вообще ничего не вернуть.
Вместо возврата на последней итерации просто верните значение true после цикла:
public static bool isTwenty(int num) { for(int j = 1; j lt;= 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 lt;= 20; j ) { if(num % j != 0) { return false; } else if(num % j == 0 amp;amp; num == 20) { return true; } else { return false; } } }
Комментарии:
1. Это «нарушает» (крайне сомнительную) логику кода операции в том смысле, что это всегда будет возвращаться на первой итерации цикла.
Ответ №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:
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 lt; a.Length; i ) { if (a[i] lt; 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:
Это обычно происходит со мной, если я неправильно помещаю оператор возврата, например:
Добавление оператора return или, в моем случае, перемещение его в правильную область действия сделает свое дело:
Комментарии:
1. Всегда лучше использовать буквальный код, а не изображения — если пользователи с нарушениями зрения используют сайт, они не могут использовать TTS для чтения этого ответа, но они могут, если вы скопируете код в виде текста.