Компилятор знает, что второй метод никогда не вернется.
Если какой-либо метод когда-либо возвращается в любых обстоятельствах, он должен вернуть bool
.
Первый метод не содержит бесконечных циклов, не генерирует никаких безусловных исключений и т. Д., Поэтому он должен возвращать bool
. Код не возвращает bool
, поэтому компилятор отказывается его компилировать.
Второй метод никогда не возвращается из-за бесконечного цикла while (true)
. Если он никогда не вернется, то не имеет значения, что (если вообще что-либо) будет никогда возвращено, поэтому компилятор позволит его скомпилировать.
Еще несколько примеров, которые компилятор распознает и разрешит:
public bool IsItTrue()
{
throw new Exception("Always thrown!");
}
public bool HowAboutThisOne()
{
if ((46 - 3) < (27 * 9))
{
throw new Exception("Always thrown!");
}
}