Перейти к содержимому

Не все пути к коду возвращают значение c как исправить

  • автор:

Как решить проблему 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

Владимир Коротенко @firedragon

Никита кстати да универсальный совет. Пользуйтесь английскими версиями и просто ищите ошибку которую получили.
Как правило 1-2 ссылка это ваше решение.

Тот же хром кстати предлагает автоматический перевод, на удивление не плохой. Можно по диагонали посмотреть и потом переключиться на английский понять все тонкости.

Решения вопроса 2

GavriKos

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

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать

MaksTR

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *