Ранее сегодня, как я кодировал метод, и он ударил меня, что я не был уверен, что именно, почему идиома, который я реализовал компилирование. Если все остальное абстрагировано, он будет выглядеть что-то подобное:
private int Example()
{
while (true)
{
if (some condition)
{
return 1;
}
}
}
У вас есть явная бесконечная петля, а некоторые набор условий внутри цикла, который приводит к концу цикла с помощью оператора возврата. Давайте проигнорируем на то время, когда я делал это, в отличие от проверки состояния прекращения в то время как о том, когда ответ был запутан и не имеет значения - то, что я хочу знать, почему компилятор не помешает это с помощью «не Все пути возвращают значение. " Ошибка, как, строго говоря, не все пути возвращают значение. Корпус, в котором цикл While никогда не вводится (который, конечно, никогда не бывает) не возвращает ничего.
Теперь, есть две причины, по которым я могу себе представить, что это происходит: это побочный эффект оптимизации, который происходит по другим причинам, или этот случай явно обрабатывается компилятором, чтобы позволить этому идиому. Мой инстинкт - это, вероятно, первый случай. Это не удивляет меня вообще, например, что это компилирует:
private int Example2()
{
if (true) return 1;
}
, потому что компилятор видит константу верному в IF, и оптимизирует условное условно. Я действительно не понимаю, почему это «исправить» первый пример, хотя.
О, и еще более странно, если в пьесе есть некоторая оптимизация, которая избавляется от цикла, это компилирует:
private int Example3()
{
while (true)
{
if (false)
{
return 1;
}
}
}
Я думаю, что вся внутренняя цикла будет оптимизирована, избавление от всех действительных возвратов Отказ Что на самом деле происходит здесь на уровне компилятора Bytecode / компилятора, что делает все это имеет смысл?