Тернарные операторы в C # - PullRequest
9 голосов
/ 04 мая 2010

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

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

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

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

Я понимаю, что это можно сделать с помощью оператора if, мне просто интересно, есть ли способ сделать это так.

Ответы [ 4 ]

11 голосов
/ 04 мая 2010

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

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");
    }
}
3 голосов
/ 04 мая 2010

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

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

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

И тогда вы можете назвать это так:

iif(x > y, Func1, Func2);

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

1 голос
/ 04 мая 2010

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

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

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

0 голосов
/ 04 мая 2010

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

...