Как уже было сказано, вы не можете сделать это с ?? оператор (ну, не без некоторых искажений, которые, кажется, не вписываются в вашу цель сделать это чище).
Когда я вижу этот паттерн, я сразу думаю о Enforcements . Первоначально из мира C ++ они довольно хорошо переносятся на C #, хотя в большинстве случаев, возможно, менее важны.
Идея состоит в том, что вы берете что-то в форме:
if( condition )
{
throw Exception;
}
и преобразует его в:
Enforce<Exception>( condition );
(вы можете еще больше упростить, указав тип исключения по умолчанию).
Если продолжить, вы можете написать набор методов в стиле Nunit для различных проверок условий, например;
Enforce<Exception>.NotNull( obj );
Enforce<Exception>.Equal( actual, expected );
Enforce<Exception>.NotEqual( actual, expected );
и т.д.
Или, еще лучше, предоставляя ожидание ламба:
Enforce<Exception>( actual, expectation );
Что действительно хорошо, так это то, что, как только вы это сделаете, вы можете вернуть фактический параметр и применить inline :
return Enforce( command.ExecuteScalar() as Int32?, (o) => o.HasValue ).Value;
... и это, кажется, ближе всего к тому, что вы ищете.
Я уже реализовал это раньше. Есть пара небольших недоразумений, например, как вы обычно создаете объект исключения, который принимает аргументы - некоторые варианты там (я выбрал отражение в то время, но передача фабрики в качестве дополнительного параметра может быть даже лучше). Но в целом все довольно просто и может действительно убрать много кода.
Это в моем списке того, что нужно сделать, чтобы запустить реализацию с открытым исходным кодом.