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