Почему вы не можете оставить выражение окончательно?
Когда я помещаю return
внутри блока оператора finally
, компилятор говорит мне:
Элемент управления не может покинуть тело предложения finally
Пример:
try
{
}
catch
{
}
finally
{
return;
}
Почему это?
Ответы
Ответ 1
Посмотрите, что произойдет, если вы столкнулись с return 1
внутри блока try
и return 0
внутри блока finally
... Ваша функция будет пытаться вернуть два значения! Комбинированные параметры try
и catch
являются исчерпывающими с точки зрения потока управления.
Ответ 2
Он по дизайну и описан в спецификации С#: 8.10 Инструкция try.
Это ошибка времени компиляции для оператора break
, continue
или goto
управление передачей из блока finally
. Когда a break
, continue
или Оператор goto
выполняется в блоке finally
, цель оператора должен находиться в одном и том же блоке finally
или, иначе, время компиляции возникает ошибка.
Это ошибка времени компиляции для оператора return
для встречаются в блоке finally
.
Ответ 3
Текущие ответы объясняют, почему это происходит хорошо, но я также считаю важным отметить, насколько легко обойти это ограничение в случае, когда не задействовано возвратное значение, а предложение finally
- это последняя вещь в методе (что часто происходит):
try {}
catch {}
finally
{
FinallyMethod();
}
Затем в FinallyMethod
вы можете использовать операторы return
столько, сколько хотите
void FinallyMethod()
{
//...
if (x == y)
return;
else
a = b;
//etc.
}