Как уже было сказано, вы не можете сделать это с ?? оператора (ну, не без некоторых искажений, которые, кажется, не соответствуют вашей цели сделать это чище).
Когда я вижу этот паттерн, я сразу же думаю о применении. Родом из мира 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 );
Что действительно здорово, так это то, что после того, как вы это сделали, вы можете вернуть параметр actual и применить inline:
return Enforce( command.ExecuteScalar() as Int32?, (o) => o.HasValue ).Value;
... и это, кажется, ближе всего к тому, что вам нужно.
Я сбил реализацию этого раньше. Есть пара небольших мелочей, например, как вы обычно создаете объект исключения, который принимает аргументы — некоторые варианты выбора (в то время я выбрал отражение, но передача фабрики в качестве дополнительного параметра может быть даже лучше). Но в целом все довольно просто и может действительно очистить много кода.
Это в моем списке вещей, которые нужно сделать, чтобы запустить реализацию с открытым исходным кодом.
person
philsquared
schedule
19.11.2009
return this as T ?? that as T ?? other as T ?? throw new NotSupportedException();
Вместо этого мне нужно использовать временную переменную, проверить ее на нуль и вернуть временную. Это просто немного уродливее. - person Tergiver   schedule 04.07.2011