簡體   English   中英

C#中的三元運算符

[英]Ternary operators in C#

使用三元運算符,可以執行以下操作(假設Func1()和Func2()返回int:

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

但是,有沒有辦法做同樣的事情,而不返回值? 例如,類似(假設Func1()和Func2()返回void):

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

我意識到這可以使用if語句來完成,我只是想知道是否有辦法像這樣做。

很奇怪,但你可以做到

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");
    }
}

我不這么認為。 據我所知,三元運算符用於表達式上下文而不是語句。 編譯器需要知道表達式的類型,void實際上不是一個類型。

您可以嘗試為此定義一個函數:

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

然后你可以這樣稱呼它:

iif(x > y, Func1, Func2);

但這並沒有真正讓你的代碼更清晰......

如果您有信心,那么您將創建一個靜態方法,其唯一目的是吸收表達式並“使其成為”語句。

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

但是我強烈建議不要使用這個“捷徑”,原因與我之前作者已經明確說明的原因相同。

不,因為三元運算符是表達式,而actions / void函數是語句。 你可以讓它們返回object ,但我認為if / else塊會使意圖更加清晰(即正在為其副作用而不是它們的值執行動作)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM