. net Ошибка компилятора «Не все пути кода возвращают значение» в методе Task - PullRequest
1 голос
/ 06 февраля 2020

Я на практике узнал, как работает Задача. net, но я все еще немного запутался с некоторыми аспектами в его значении. При рефакторинге старого кода у меня просто случился следующий незаконченный кусок кода в одном из моих классов:

    private Task StartDataCollection()
    {
         // Some other code here but no Task.Run()
    }

И, конечно, компилятор жалуется:

Ошибка CS0161 .. .: не все пути кода возвращают значение

Затем я добавил l oop к коду, как показано ниже, и ошибка компилятора исчезла:

    private Task StartDataCollection()
    {
         while(true)
         {
         }
    }

Только для любопытство Я изменил пока l oop, как показано ниже, и компилятор снова жалуется на ту же ошибку:

    private Task StartDataCollection()
    {
         while(false)
         {
         }
    }

И это то, что действительно смущает меня. Если компилятор выдает ошибку CS0161 из-за отсутствия оператора возврата (или чего-то еще, такого как Task.Run ()), то почему while (true) может это исправить? Означает ли это, что некоторое время (true) l oop в фоновом режиме запускает задание? Я так не думаю .... Может быть, я здесь упускаю точку.

1 Ответ

0 голосов
/ 06 февраля 2020

Реальное значение CS0161 на самом деле заключается не в том, «каждый ли путь кода возвращает значение», а в том, что «существует ли путь кода, который каким-то образом достигает конца метода, а не возвращает » ценность". Компилятор ловко определяет, что while (true) без break - это всего лишь oop, который не может быть завершен для продолжения после * while, так что нет никакого способа достичь конца метод. Итак: он не делает ничего плохого с точки зрения компилятора .

Конечно, это все еще очень неправильно.

Примечание: если вы добавите:

static bool AlwaysTrue() => true;

и изменить на while (AlwaysTrue()), теперь он выдаст вам ошибку CS0161, потому что это обнаружение невыполненного l oop задает c для константных выражений, которые можно тривиально оценить как true.

Это не имеет никакого отношения к запуску Task в фоновом режиме. Он сделал бы то же самое, если бы вы указали int или string в качестве типа возврата.


Аналогично, он выдаст вам предупреждение CS0162 (обнаружен недоступный код), если вы сделаете:

while (false)
{
    Console.WriteLine("Hi");
}
...