Ошибка "не все пути к коду возвращают значение"
Задание — написать метод, принимающий int значение number и возвращающий сумму чисел от 1 до number. Подскажите, пожалуйста в чем причина ошибки "CS0161 — "Program.Sum(int)": Не все пути к коду возвращают значение" и как этой ошибки избежать.
Не все пути к коду возвращают значение — значит, что есть такие параметры, при которых функция, которая должна вернуть значение, выполнит команду return — то есть не вернет значение. Это может произойти по разным случаям: вы не написали команду return, вы написали ее в условии, которое не всегда истинно, ИЛИ вы написали ее в цикле, который может не дойти до этой строки.
Проще говоря, представьте, что произойдет, если на вход в функцию попадет неположительное число.
Если вы хотите посчитать сумму чисел от 1 до N, то возвращение результата должно будет после цикла, когда результат переменной result сформировался окончательно:
![]()
Значение нужно возвращать вне цикла
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.9.7.43618
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
c # возвращает ошибку «не все пути кода возвращают значение»
Я пытаюсь написать код, который возвращает, делится ли данное целое равномерно на 1-20,
но я продолжаю получать следующую ошибку:
error CS0161: ‘ProblemFive.isTwenty(int)’: не все пути кода возвращают значение
8 ответов
Вам не хватает инструкции return .
Когда компилятор просматривает ваш код, он видит третий путь ( else , который вы не кодировали), который может произойти, но не возвращает значение. Следовательно, not all code paths return a value .
Для моего предложенного исправления я положил return после окончания цикла. Другое очевидное пятно — добавление else , имеющее значение return для if-else-if -, разбило бы цикл for .
Компилятор не получает сложную логику, в которой вы возвращаетесь в последней итерации цикла, поэтому он думает, что вы можете выйти из цикла и в конечном итоге ничего не вернуть.
Вместо возврата в последнюю итерацию просто верните true после цикла:
Обратите внимание: в исходном коде есть логическая ошибка. Вы проверяете, если num == 20 в последнем условии, но вы должны были проверить, есть ли j == 20 . Также проверьте, была ли num % j == 0 суперплошной, так как это всегда верно, когда вы туда попали.
Я также испытал эту проблему и нашел легкое решение
Это также работает с другими типами возвращаемых данных и дает наименьшее количество проблем
Исходное значение, которое я выбрал, было значением спада, и я смог повторно назначить значение столько раз, сколько требуется.
Или просто сделайте это:
Мне нравится бить мертвых лошадей, но я просто хотел сделать дополнительную мысль:
Прежде всего, проблема заключается в том, что не все условия вашей структуры управления были устранены. По сути, вы говорите, если a, то это, иначе, если b, то это. Конец. Но что, если и нет? Невозможно выйти (т.е. Не каждый «путь» возвращает значение).
Мое дополнительное замечание состоит в том, что это пример того, почему вы должны стремиться к одному выходу, если это возможно. В этом примере вы сделали бы что-то вроде этого:
Итак, здесь всегда есть оператор return, и метод всегда выходит в одном месте. Несколько вещей, которые следует учитывать, хотя. вам нужно убедиться, что ваше значение выхода действительно на каждом пути или, по крайней мере, приемлемо. Например, эта структура принятия решений учитывает только три возможности, но единственный выход также может выступать в качестве вашего последнего заявления. Или это? Вы должны убедиться, что окончательное возвращаемое значение действительно для всех путей. Это гораздо лучший способ приблизиться к ней, имея 50 миллионов точек выхода.
C# CS0161 Not all code paths return a value
Ошибка C# CS0161 Not all code paths return a value (Не все ветви кода возвращают значение) кроется в том, что можно перепутать возвращаемый метод и метод, который ничего не возвращает.
Например, если написать:
public class Program
public static void Main()
static string Test(string a)
На первый взгляд, кажется всё нормально. Но компилятор ругается на строку с названием метода Test. Почему? Да потому, что вместо того, чтобы вернуть значение а в консоль просто выводится значение а. Исправим ситуацию:
Не все пути к коду возвращают значение c как исправить
Проинициализируй переменные например вот так:
И посмотри на сигнатуру своей функции:
public static double Ras_cv_nevti_v_plas(double ppl, double Tpl, double Rnd, double G, double Pnas, double Rgo, out double Mn_pl)
Она у тебя возвращает значение double, а у тебя ни одного return во всей функции
Добавь в код возврат значения, либо поменяй возвращаемый тип на void
- Изменено Дмитрий Арндт 20 декабря 2011 г. 7:39 a
- Помечено в качестве ответа Abolmasov Dmitry 21 декабря 2011 г. 9:34
Все ответы
> В итоге переменная del не определена и не все ветви кода возвращают значение. тоже и с остальными 2.
скорее всего требуется <= и >=, вместо < и >.
например, следующий код ничего не выводит из-за < и >.
- Помечено в качестве ответа Abolmasov Dmitry 21 декабря 2011 г. 9:34
попробовал, не помогло. »ошибка неопределения переменной» возникает после условия при использовании этой переменной. А »не все ветви кода воз. » для всего метода. скидываю весь метод:
public static double Ras_cv_nevti_v_plas(double ppl, double Tpl, double Rnd, double G, double Pnas, double Rgo, out double Mn_pl)
double x, an, m, Gpl, a, Y, G1, Rgr_pl, Mnd, A, B, bnpl, Mnd_t, del, Rn_pl, a1, b1, Mn_nas, sig;
m = 1 + 0.029 * (Tpl — 293) * (Rnd * Rgo * 1e-3 — 0.7966);
a = 1 + 0.0054 * (Tpl — 293);
Rgr_pl = a * m * Rgo * G / Gpl;
Y = 1e-3 * (4.3 — 3.54 * 1e-3 * Rnd + 1.0337 * Rgr_pl / a + 5.581 * 1e-6 * Rnd * (1 — 1.61 * 1e-6 * Rnd * Gpl) * Gpl);
an = 1e-3 * (3.083 — 2.638 * 1e-3 * Rnd);
an = 1e-3 * (2.513 — 1.975 * 1e-3 * Rnd);
bnpl = 1 + (1.0733 * 1e-3 * Rnd * Y * Gpl) / m + an * (Tpl — 293) — 6.5 * 1e-4 * ppl; \\ Здесь неопределена an
Rn_pl = Rnd * (1 + 1.293 * 1e-3 * Rgr_pl * Gpl / (m * a)) / bnpl;
x = (0.658 * Rnd * Rnd) / (866 * 1e3 — Rnd * Rnd);
Mnd = Math.Pow(x, 2);
if (780 < Rnd && Rnd <= 845)
x = (0.456 * Rnd * Rnd) / (833 * 1e3 — Rnd * Rnd);
Mnd = Math.Pow(x, 2);
a1 = Math.Pow(10, (-0.0175 * (293 — Tpl) — 2.58));
b1 = (8 * 1e-5 * Rnd — 0.047) * Math.Pow(Mnd, 0.13 + 0.002 * (Tpl — 293)); \\Здесь неопределена Mnd
Mnd_t = Mnd * Math.Pow(Tpl — 293, a1) * Math.Exp(b1 * (293 — Tpl));
G1 = 1.055 * 1e-3 * (1 + 5 * an) * G * Rnd;
A = 1 + 0.0129 * G1 — 0.0364 * Math.Pow(G1, 0.85);
B = 1 + 0.0017 * G1 — 0.0228 * Math.Pow(G1, 0.667);
Mn_nas = A * Math.Pow(Mnd_t, B);
if (Mn_nas > 0 && Mn_nas < 5)
del = 0.0114 * Mn_nas;
if (Mn_nas > 5 && Mn_nas < 10)
del = 0.057 + 0.023 * (Mn_nas — 5);
if (Mn_nas > 10 && Mn_nas < 25)
del = 0.0171 + 0.031 * (Mn_nas — 10);
if (Mn_nas > 25 && Mn_nas < 45)
del = 0.643 + 0.045 * (Mn_nas — 25);
if (Mn_nas > 45 && Mn_nas < 75)
del = 1.539 + 0.058 * (Mn_nas — 45);
if (Mn_nas > 75 && Mn_nas < 85)
del = 3.286 + 0.100 * (Mn_nas — 75);
Mn_pl = Mn_nas + del * (ppl — Pnas); \\ Здесь неопределена del
sig = Math.Pow(10, -(1.58 + 0.05 * ppl) — 72 * 1e-6 * (Tpl — 305));
Интересно что при добавлении в условие еще 1 ветви else и присвоении неопр-м переменным любого числа проблема исчезает. А вот с »не все ветви кода воз. » даже нет вариантов как решить