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