Как решить проблему CS0161 в C#?
Я новичок в C# и недавно начал изучать функции. Мне надо сделать программу которая запрашивает числа, знак и выполняет действие (калькулятор короче). Но я столкнулся с проблемой, вот как она звучит:
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка CS0161 ‘»Program.Nikita(int, int, char)»: не все пути к коду возвращают значение.
вот код программы:
public static int Nikita(int a, int b, char d) < switch (d) < case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: Console.WriteLine("Ошибка"); break; >//return a - b; > static void Main(string[] args) < < Console.Write("вевдите первое число: "); int am = (int)Convert.ToInt64(Console.ReadLine()); Console.Write("введите знак: "); char dm = Convert.ToChar(Console.ReadLine()); Console.Write("введите второе число: "); int bm = (int)Convert.ToInt64(Console.ReadLine()); int resault = Nikita(am, bm, dm); Console.WriteLine(am); Console.WriteLine(bm); Console.WriteLine(dm); Console.WriteLine(resault); >> > >
- Вопрос задан более трёх лет назад
- 2040 просмотров
1 комментарий
Простой 1 комментарий

Владимир Коротенко @firedragon
Никита кстати да универсальный совет. Пользуйтесь английскими версиями и просто ищите ошибку которую получили.
Как правило 1-2 ссылка это ваше решение.
Тот же хром кстати предлагает автоматический перевод, на удивление не плохой. Можно по диагонали посмотреть и потом переключиться на английский понять все тонкости.
Решения вопроса 2

Ну вам даже на русском пишут (кстати переключите на английский. И код в тег код оберните).
Что должна вернуть функция Nikita, если я в нее передам третим параметром ‘q’, например?
Крч функция с возвращаемым параметром должна возвращать значение ВСЕГДА. Или кидать эксепшн.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать

В секции default тоже должен присутствовать return. Об этом и говорит текст ошибки «не все пути к коду возвращают значение»
default: Console.WriteLine("Ошибка"); return значение_при_ошибке; break;
C# не все ветви кода возвращают значение
Я язык разбираю, так что, могут быть вообще элементарные ошибки..
static double Main(double a,ref double c)
<
int n;
string v = Console.ReadLine();
int.TryParse(v, out n);
while (n > 0)
<
if (n == 1)
return c = 1;
if (n > 1)
return c = 1 + (1 / c);
>
>
Дополнен 10 лет назад
Ни одно из решений не помогло.. Лишь появилась ещё одна ошибка: «имеет неправильную сигнатуру и не может быть точкой входа»
Дополнен 10 лет назад
Да, изменение n забыл.. Но всё равно, ошибка не пропадает..
Лучший ответ
не особо вникая в детали именно си-шарпа
не стоит
<
if(условие1)return 1;
if(условие2)return 2;
>
а если ни условие1 ни условие2? тогда что?
надо или
<
if(условие1)return 1;
if(условие2)return 2;
return 3; // то куда пришло если не сработали те условия
>
или лучше
<
if(условие1)return 1;
else if(условие2)return 2;
else return 3;
>
———-
а
while (n > 0)
будет крутиться до бесконечности при постоянном n — воткни внутрь цикла изменение n.
например
n—;
Остальные ответы
ну добавь в конце перед последней фигурной скобкой return 0; просто у тебя return стоит в условии, а это не 100% возвращаемость значения, а нужно чтобы метод 100% возвращал значение
Ну ты балда!static void main() должно быть!Это же точка входа приложения, произвольно возращать double эта функция не может!
Ошибка «не все пути к коду возвращают значение»
Задание — написать метод, принимающий int значение number и возвращающий сумму чисел от 1 до number. Подскажите, пожалуйста в чем причина ошибки «CS0161 — «Program.Sum(int)»: Не все пути к коду возвращают значение» и как этой ошибки избежать.
class Program < static int Sum(int number) < int result = 0; for (int i = 1; i > static void Main(string[] args) < int number = Convert.ToInt32(Console.ReadLine()); Console.WriteLine(Sum(number)); >>
Отслеживать
задан 17 окт 2020 в 10:24
faritowich faritowich
105 1 1 золотой знак 1 1 серебряный знак 12 12 бронзовых знаков
а зачем вы в цикле возвращаете результат?
17 окт 2020 в 10:33
return result; должно быть за пределами цикла
17 окт 2020 в 10:36
в чем причина — ну, в ошибке вам прямым текстом говорят, в чем Не все пути возвращают значение . Задайте себе вопрос, а что вернет метод, если условия цикла не сработает, к примеру, если вызвать Sum(0) ?
17 окт 2020 в 10:37
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Не все пути к коду возвращают значение — значит, что есть такие параметры, при которых функция, которая должна вернуть значение, выполнит команду return — то есть не вернет значение. Это может произойти по разным случаям: вы не написали команду return, вы написали ее в условии, которое не всегда истинно, ИЛИ вы написали ее в цикле, который может не дойти до этой строки.
Проще говоря, представьте, что произойдет, если на вход в функцию попадет неположительное число.
Если вы хотите посчитать сумму чисел от 1 до N, то возвращение результата должно будет после цикла, когда результат переменной result сформировался окончательно:
static int Sum(int number) < int result = 0; for (int i = 1; i return result; >
Never¶
При разработке языка программирования используется понятие bottom типа, который является естественным результатом анализа потока кода. TypeScript выполняет анализ потока кода (), поэтому он должен достоверно представлять то, что никогда не произойдёт.
Тип never используется в TypeScript для обозначения этого типа bottom. Случаи, когда это происходит естественным путем:
- Функция никогда ничего не вернёт (например, если в теле функции есть while(true)<> )
- Функция всегда выбрасывает ошибку (например, в function foo () тип возвращаемого значения функции foo — never )
Конечно, вы можете использовать это описание и сами:
let foo: never; // Okay
Тем не менее, never может быть присвоено только другое never. Например:
1 2 3 4 5 6 7 8
let foo: never = 123; // Ошибка: Тип number нельзя присвоить типу never // Okay, так как тип возвращаемого значения функции - `never` let bar: never = (() => throw new Error( 'Поднимаю руки вверх, будто мне все равно' ); >)();
Отлично. Теперь давайте перейдем к основному варианту использования 🙂
Пример использования: тщательные проверки¶
Вы можете вызывать функции never в never-обстоятельствах.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
function foo(x: string | number): boolean if (typeof x === 'string') return true; > else if (typeof x === 'number') return false; > // Без типа never мы бы ошиблись: // - Не все пути кода возвращают значение (строгие проверки на null) // - Или обнаружен недостижимый код // Но поскольку TypeScript понимает, что функция `fail` возвращает `never` // Он может позволить вам вызвать её, поскольку вы могли бы использовать её // для безопасности выполнения / тщательных проверок. return fail('Нетщательный!'); > function fail(message: string): never throw new Error(message); >
А поскольку never назначается только другому never , вы также можете использовать его для тщательных проверок во время компиляции. Это описано в разделе размеченные объединения.
Путаница с void ¶
Как только кто-то говорит вам, что возвращается never , когда функция никогда не завершается корректно и ничего не будет возвращено, вы интуитивно хотите думать об этом как о void . Однако void — это значение. «Never» — ложное утверждение в логике.
Функция, которая ничего не возвращает, возвращает значение void . Однако функция которая никогда ничего не возвращает (или всегда выбрасывает ошибку), возвращает never . void — это то, что может быть присвоено (без strictNullChecking ), но never никогда не может быть присвоено чему-либо, кроме never .
Логический вывод типа в функциях, которые никогда ничего не возвращают¶
Для объявлений функций TypeScript по умолчанию подразумевает void , как показано ниже:
1 2 3 4 5 6 7 8
// Предполагаемый тип возвращаемого значения: void function failDeclaration(message: string) throw new Error(message); > // Предполагаемый тип возвращаемого значения: never const failExpression = function (message: string) throw new Error(message); >;
Конечно, вы можете исправить это подробным описанием:
1 2 3
function failDeclaration(message: string): never throw new Error(message); >
Основная причина — обратная совместимость с реальным кодом JavaScript:
1 2 3 4 5 6 7 8 9 10
class Base overrideMe() throw new Error('Ты забыл переопределить меня!'); > > class Derived extends Base overrideMe() // Код, который на самом деле возвращается сюда > >
Реальный TypeScript может преодолеть это с помощью abstract функций, но этот логический вывод поддерживается для совместимости.