10

三項演算子を使用すると、次のようなことが可能になります (Func1() と Func2() が int を返すと仮定します)。

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

ただし、値を返さずに同じことを行う方法はありますか? たとえば、次のようなものです (Func1() と Func2() が void を返すと仮定します):

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

これは if ステートメントを使用して実現できることがわかりました。このようにする方法があるかどうか疑問に思いました。

4

4 に答える 4

11

奇妙ですが、あなたはできる

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");
    }
}
于 2010-05-04T12:58:55.283 に答える
3

私はそうは思わない。私が覚えている限りでは、三項演算子はステートメントとしてではなく、式のコンテキストで使用されます。コンパイラは式の型を知る必要がありますが、実際には型でvoidはありません。

このための関数を定義しようとすることができます:

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

そして、次のように呼び出すことができます。

iif(x > y, Func1, Func2);

しかし、これで実際にコードが明確になるわけではありません...

于 2010-05-04T12:54:35.343 に答える
1

自信がある場合は、式を吸収してステートメントに "作成" することのみを目的とする静的メソッドを作成します。

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

ただし、以前の著者によってすでに明示されているのと同じ理由で、この「ショートカット」を使用しないことを強くお勧めします。

于 2010-05-04T13:08:28.473 に答える
0

いいえ、三項演算子は式であるのに対し、actions/void 関数はステートメントであるためです。return にすることもできobjectますが、if/else ブロックを使用すると意図がより明確になると思います (つまり、アクションは値ではなく副作用に対して実行されます)。

于 2010-05-04T12:54:19.337 に答える