Не все пути к коду возвращают значение c как исправить
Регистрация: 19.11.2016
Сообщений: 6
не все ветви кода возвращают значения c#
ребят помогите, после завтра сдавать лабу, вот задание
Постройте таблицу значений функции y=f(x) для х[a, b] с шагом h.
Замечание
При решении задачи разработайте две версии метода f так, чтобы их сигнатуры соответствовали следующим описаниям:
static double f (double x)
static void f (double x, out double y)
Безымянный.png
вот код написал, пишет что не все ветви кода возвращают значения,что за фигня, может код не так написал
class Program < static void Main(string[] args) < int a = 0; int b = 0; int h = 0; double y = 0; Console.WriteLine("Введите нижний диапазон: "); Read(ref a); Console.WriteLine("Введите верхний диапазон: "); Read(ref b); Console.WriteLine("Введите шаг: "); Read(ref h); Console.WriteLine(); if ((b >a) && (h < (b - a)) && (h >0)) < Console.WriteLine(" 1 способ | 2 способ\n", "|"); for (double x = a; x |", f(x)); f(x, out y); Console.WriteLine(" ", y); > > else < Console.WriteLine("Проверьте значения"); >Console.ReadKey(); > static void Read(ref int n) < bool f = false; while (!f) < f = int.TryParse(Console.ReadLine(), out n); if (f == false) < Console.WriteLine("Неверные данные. Попробуйте снова!"); >> > static double f (double x) < if (x < 1) < Math.Pow(x * x - 1, 2); >else if (x > 1) < Math.Pow(1/ 1+x , 2); >else if (x == 1) return 0; > static void f(double x, out double y) < y = 0; if (x < 1) < y = Math.Pow(x * x - 1, 2); >else if ( x > 1) < y = Math.Pow(1 / 1 + x, 2); >else if (x==1) < y=0; >> > >
Последний раз редактировалось alexandrik121; 03.12.2016 в 23:34 .
| alexandrik121 |
| Посмотреть профиль |
| Найти ещё сообщения от alexandrik121 |
Ошибка компилятора CS0161
Метод, возвращающий значение, должен иметь оператор return во всех путях кода. Дополнительные сведения см. в статье Методы.
Пример
Следующий пример приводит к возникновению ошибки CS0161.
// CS0161.cs public class Test < public static int Main() // CS0161 < int i = 5; if (i < 10) < return i; >else < // Uncomment the following line to resolve. // return 1; >> >
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
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 функций, но этот логический вывод поддерживается для совместимости.
Ошибка «не все пути к коду возвращают значение»
Задание — написать метод, принимающий 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 серебряный знак 13 13 бронзовых знаков
а зачем вы в цикле возвращаете результат?
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; >