Начиная с C # 7.0, ключевое слово throw
можно использовать как в качестве выражения, так и в качестве выражения, что приятно.
Хотя учтите эти перегрузки
public static void M(Action doIt) { /*use doIt*/ }
public static void M(Func<int> doIt) { /*use doIt*/ }
При таком вызове
M(() => throw new Exception());
или даже так (с лямбда-выражением)
M(() => { throw new Exception(); });
Перегрузка M (Func <>) выбирается компилятором, указывая, что бросок здесь рассматривается как выражение.
Как я могу изящно и с явным намерением заставить компилятор выбрать перегрузку M (Action)?
Один из способов сделать это - это
M(() => { throw new Exception(); return; });
но причина оператора return кажется неочевидной, и существует риск изменения следующего разработчика, тем более что Resharper предупреждает о недоступном коде.
(Конечно, я могу изменить название метода, чтобы избежать перегрузки, но это не вопрос.: -)