Тернарные операторы в C#

С тернарным оператором возможно сделать что-то как следующее (принимающий Func1 (), и Func2 () возвращают интервал:

int x = (x == y) ? Func1() : Func2();

Однако там какой-либо путь состоит в том, чтобы сделать то же самое, не возвращая значение? Например, что-то как (принимающий Func1 () и Func2 () возвращаются пусто):

(x == y) ? Func1() : Func2();

Я понимаю, что это могло быть выполнено с помощью, если бы оператор, я просто задался вопросом, был ли способ сделать это как это.

9
задан Paul Michaels 4 May 2010 в 12:51
поделиться

4 ответа

Странно, но вы могли бы сделать

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");
    }
}
11
ответ дан 4 December 2019 в 13:46
поделиться

Если вы чувствуете себя уверенно, вы должны создать статический метод, единственная цель которого - усвоить выражение и «сделать его» утверждением.

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());

Однако я настоятельно рекомендую не использовать этот «ярлык» по тем же причинам, которые уже были явно указаны авторами до меня.

1
ответ дан 4 December 2019 в 13:46
поделиться

Я так не думаю. Насколько я помню, троичный оператор используется в контексте выражения, а не в качестве оператора. Компилятору нужно знать тип выражения, а void - это не совсем тип.

Вы можете попытаться определить функцию для этого:

void iif(bool condition, Action a, Action b)
{
    if (condition) a(); else b();
}

А затем вызвать ее так:

iif(x > y, Func1, Func2);

Но это не сделает ваш код более понятным...

3
ответ дан 4 December 2019 в 13:46
поделиться

Нет, потому что троичный оператор - это выражение, тогда как действия/пустые функции - это утверждения. Можно сделать так, чтобы они возвращали object, но я думаю, что блок if/else сделает замысел гораздо более ясным (т.е. действия выполняются для их побочных эффектов, а не для их значений).

0
ответ дан 4 December 2019 в 13:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: