С тернарным оператором возможно сделать что-то как следующее (принимающий Func1 (), и Func2 () возвращают интервал:
int x = (x == y) ? Func1() : Func2();
Однако там какой-либо путь состоит в том, чтобы сделать то же самое, не возвращая значение? Например, что-то как (принимающий Func1 () и Func2 () возвращаются пусто):
(x == y) ? Func1() : Func2();
Я понимаю, что это могло быть выполнено с помощью, если бы оператор, я просто задался вопросом, был ли способ сделать это как это.
Странно, но вы могли бы сделать
class Program
{
private delegate void F();
static void Main(string[] args)
{
((1 == 1) ? new F(f1) : new F(f2))();
}
static void f1()
{
Console.WriteLine("1");
}
static void f2()
{
Console.WriteLine("2");
}
}
Если вы чувствуете себя уверенно, вы должны создать статический метод, единственная цель которого - усвоить выражение и «сделать его» утверждением.
public static class Extension
{
public static void Do(this Object x) { }
}
Таким образом, вы могли вызвать тернарный оператор и вызвать для него метод расширения.
((x == y) ? Func1() : Func2()).Do();
Или, почти эквивалентным способом, написать статический метод (если класс, в котором вы хотите использовать этот «ярлык», ограничен).
private static void Do(object item){ }
... и называя это таким образом
Do((x == y) ? Func1() : Func2());
Однако я настоятельно рекомендую не использовать этот «ярлык» по тем же причинам, которые уже были явно указаны авторами до меня.
Я так не думаю. Насколько я помню, троичный оператор используется в контексте выражения, а не в качестве оператора. Компилятору нужно знать тип выражения, а void
- это не совсем тип.
Вы можете попытаться определить функцию для этого:
void iif(bool condition, Action a, Action b)
{
if (condition) a(); else b();
}
А затем вызвать ее так:
iif(x > y, Func1, Func2);
Но это не сделает ваш код более понятным...
Нет, потому что троичный оператор - это выражение, тогда как действия/пустые функции - это утверждения. Можно сделать так, чтобы они возвращали object
, но я думаю, что блок if/else сделает замысел гораздо более ясным (т.е. действия выполняются для их побочных эффектов, а не для их значений).