Реальное значение 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");
}