В Perl вы можете сделать foo() or bar()
, который выполнит bar()
, если foo()
не удастся. В C # мы не видим эту конструкцию «если не получится, тогда», но есть оператор, который мы можем использовать для этой цели: оператор null-coalesce ??
, который продолжается, только если первая часть равна нулю.
Если вы можете изменить сигнатуру своих вычислений и если вы либо заключите их исключения (как показано в предыдущих сообщениях), либо перепишете их, чтобы вернуть null
, ваша цепочка кодов будет становиться все более краткой и все еще легко читаемой:
double? val = Calc1() ?? Calc2() ?? Calc3() ?? Calc4();
if(!val.HasValue)
throw new NoCalcsWorkedException();
Я использовал следующие замены для ваших функций, что приводит к значению 40.40
в val
.
static double? Calc1() { return null; /* failed */}
static double? Calc2() { return null; /* failed */}
static double? Calc3() { return null; /* failed */}
static double? Calc4() { return 40.40; /* success! */}
Я понимаю, что это решение не всегда будет применимо, но вы задали очень интересный вопрос, и я верю, что, хотя тема довольно старая, этот шаблон стоит рассмотреть, когда можно вносить исправления.