не все пути к коду возвращают значение unity
Не все ветви кода возвращают значение
CS0161 «Program.Calculate(string, int, int)»: не все ветви кода возвращают значение. ConsoleApp1 C:\Users\денис\source\repos\calculateoncsharp\ConsoleApp1\Program.cs
3 ответа 3
Перехватывать исключение и выводить сообщение об ошибке будет вызывающая сторона:
Метод в любом случае должен возвращает значение типа int. В ветке default ничего не возвращается, поэтому и ошибка.
В default надо возвращать какое-то значение типа int, которое возвращает функция
Всё ещё ищете ответ? Посмотрите другие вопросы с метками c# или задайте свой вопрос.
Связанные
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.9.27.40313
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
c# returning error » не все пути кода возвращают значение»
Я пытаюсь написать код, который возвращает, делится ли данное целое число равномерно на 1 до 20,
но я продолжаю получать следующее сообщение об ошибке:
ошибка CS0161: ‘ProblemFive.isTwenty (int)’: не все пути кода возвращают значение
8 ответов
вы пропускаете return заявление.
компилятор не получает сложную логику, в которой вы возвращаетесь в последней итерации цикла, поэтому он думает, что вы можете выйти из цикла и в конечном итоге ничего не возвращать.
вместо того, чтобы возвращаться в последней итерации, просто верните true после цикла:
Я также испытал эту проблему и нашел простое решение быть
Это также работает с другими типами возврата и дает наименьшее количество проблем
начальное значение, которое я выбрал, было резервным значением, и я смог повторно назначить значение столько раз, сколько требуется.
или просто сделайте это:
Мне нравится бить мертвых лошадей, но я просто хотел сделать дополнительный момент:
прежде всего, проблема в том, что не все условия вашей структуры управления были рассмотрены. По сути, вы говорите, если a, то это, иначе если b, то это. Конец. Но что если нет? Выхода нет (т. е. не каждый «путь» возвращает значение).
мой дополнительный момент заключается в том, что это пример того, почему вы должны стремиться к одному выходу, если это возможно. В этом примере вы сделал бы что-то вроде этого:
Итак, здесь вы всегда оператор return и метод всегда выходит в одном месте. Пару вещей, чтобы рассмотреть. вы должны убедиться, что ваше значение выхода действительно на каждом пути или, по крайней мере, приемлемо. Например, эта структура решений учитывает только три возможности, но единственный выход может также выступать в качестве окончательного утверждения else. Или нет? Необходимо убедиться, что конечное возвращаемое значение допустимо для всех путей. Это гораздо лучший способ приблизиться к нему по сравнению с 50 миллионами точек выхода.
взгляните на это. Это тернарный оператор в C#.
Это просто, чтобы показать принцип; вы можете вернуть True или False (или даже целое число или строку) в зависимости от результата чего-то в левой части вопросительного знака. Хороший оператор.
три варианта вместе:
Это должно работать, иначе я получил ошибку, что не все кодовые пути возвращают значение. Поэтому я устанавливаю результат как возвращаемое значение, которое устанавливается как B или A в зависимости от того, что true
Я получил эту ошибку при попытке открыть проект VS 2017 в VS 2015. Конечно, решение должно было открыться в 2017 году.
Причина ошибки CS0161: не все пути кода возвращают значение
Я сделал основной метод расширения, чтобы добавить функциональность повтора в мой HttpClient.PostAsync :
приведенный выше код дает мне следующую ошибку:
ошибка CS0161 ‘ HttpClientExtensions.PostWithRetryAsync (HttpClient, Uri, HttpContent, int, Action)’: не все пути кода возвращают значение.
если я добавить throw new InvalidOperationException() в конце (или return null Если на то пошло), ошибка уходит, как и ожидалось. Что я действительно хотел бы знать: есть ли код путь, который фактически выходит из этого метода без возвращаемого значения или исключения? Я его не вижу. Знаю ли я больше, чем компилятор в этом случае, или наоборот?
4 ответов
простая причина заключается в том, что компилятор должен иметь возможность статически проверить все пути потока выполнения заканчиваются инструкцией return (или исключением).
так в основном компилятор должен проверить эти вещи:
компилятор просто не в состоянии проверить это.
давайте попробуем очень простой пример:
этот тривиальный пример будет генерировать тот же ошибка:
CS0161 ‘ Test ()’: не все пути кода возвращают значение
таким образом, компилятор не может вывести это из-за этих фактов:
затем код всегда будет возвращать значение 10.
теперь посмотрите на этот пример:
весь while цикл и локальная переменная исчезли, все осталось только это:
так ясно, что компилятор не посмотрите на значения переменных, когда он статически анализирует эти вещи. Стоимость реализации этой функции и ее правильного использования, вероятно, перевешивает эффект или обратную сторону не делать этого. Запомните это » каждая функция начинается в отверстии на 100 пунктов, что означает, что она должна иметь значительный чистый положительный эффект на общий пакет, чтобы он попал в язык.».
да, это определенно тот случай, когда вы знаете больше о чем компилятор.
просто для полноты, давайте посмотрим на все способы вашего кода может течь:
таким образом, в принципе, можно сказать, что этот код всегда заканчивается либо исключением, либо возвращением, но компилятор не может статически проверить это.
теперь управление потоком выглядит это:
даже этот метод будет составлять:
Если он бросает HttpRequestException и блок catch выполняется, он может пропустить бросить оператор в зависимости от условия (попытка > maxAttempts), чтобы этот путь ничего не возвращал.
но если вы хотите продолжить цикл, вам нужно вернуться в конце:
as Error заявляет, что not all code paths return a value вы не возвращаете значение для каждого пути кода
вы должны создать исключение или вернуть значение
вы можете изменить свой код, чтобы весь путь кода возвращал значение. код должен быть примерно таким
Ошибка С# – «Не все пути кода возвращают значение»
Что мне не хватает?
Вам нужно использовать LINQ с помощью An y, замените свой код:
с более простым кодом:
Или даже более высокая производительность:
Редактировать: с вашим комментарием ниже код – это то, что вам нужно:
Если ни один элемент в вашей entity коллекции, то ни вмещающего если/иначе ветки не будут выполнены. В этом случае больше нет оператора return, потому else часть else не будет выполнена, а вне вашего foreach вас нет оператора return.
Компилятор не “видит”, что если
Предположим, что в первый раз, когда entity перечислит, он дает некоторое (конечное число) элементов. Тогда Count будет отличным от нуля. Тогда предположим, что в следующий раз, когда тот же entity перечислит, он не даст никаких предметов! Это приведет к тому, что ваш код “провалится” без возврата.
Очень вероятно, что вы можете гарантировать, что источник дает одинаковое количество элементов при каждом повторном перечислении. Но компилятор не может.
Вы ничего не извлекали из этого блока кода
Это означает, что ваш блок if будет работать, но часть foreach не будет работать. Поскольку ваша if часть не имеет оператора возврата, почему вы получаете сообщение об ошибке.
Вы должны поставить оператор return в свою if часть.
Вы можете подумать о следующем. Это будет придерживаться принципа ” единого выхода ” (который иногда может помочь улучшить четкость кода) и обеспечить в любом случае значение по умолчанию:
Если в вашей коллекции объектов нет элементов, вы не достигнете оператора return – вам нужно добавить return false forexample в качестве последнего оператора
Компилятор не может гарантировать, что первый вызов Count означает, что foreach будет зацикливаться хотя бы один раз (без уважительной причины, потому что вы могли бы, если хотите, создать коллекцию, где это было неверно). Вы можете сделать это вместо (без необходимости внешнего if ):
c # возвращает ошибку «не все пути кода возвращают значение»
Я пытаюсь написать код, который возвращает, делится ли данное целое равномерно на 1-20,
но я продолжаю получать следующую ошибку:
error CS0161: ‘ProblemFive.isTwenty(int)’: не все пути кода возвращают значение
8 ответов
Компилятор не получает сложную логику, в которой вы возвращаетесь в последней итерации цикла, поэтому он думает, что вы можете выйти из цикла и в конечном итоге ничего не вернуть.
Вместо возврата в последнюю итерацию просто верните true после цикла:
Я также испытал эту проблему и нашел легкое решение
Это также работает с другими типами возвращаемых данных и дает наименьшее количество проблем
Исходное значение, которое я выбрал, было значением спада, и я смог повторно назначить значение столько раз, сколько требуется.
Или просто сделайте это:
Мне нравится бить мертвых лошадей, но я просто хотел сделать дополнительную мысль:
Прежде всего, проблема заключается в том, что не все условия вашей структуры управления были устранены. По сути, вы говорите, если a, то это, иначе, если b, то это. Конец. Но что, если и нет? Невозможно выйти (т.е. Не каждый «путь» возвращает значение).
Мое дополнительное замечание состоит в том, что это пример того, почему вы должны стремиться к одному выходу, если это возможно. В этом примере вы сделали бы что-то вроде этого:
Итак, здесь всегда есть оператор return, и метод всегда выходит в одном месте. Несколько вещей, которые следует учитывать, хотя. вам нужно убедиться, что ваше значение выхода действительно на каждом пути или, по крайней мере, приемлемо. Например, эта структура принятия решений учитывает только три возможности, но единственный выход также может выступать в качестве вашего последнего заявления. Или это? Вы должны убедиться, что окончательное возвращаемое значение действительно для всех путей. Это гораздо лучший способ приблизиться к ней, имея 50 миллионов точек выхода.