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

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

  • автор:

Не все пути к коду возвращают значение 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; > 

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

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