2012-05-28 71 views
2

爲什麼我不能運行下面的代碼?三元「?:operator」在C#中有錯誤嗎?

static int num = 0; 
    static void Main(string[] args) 
    { 
     (num == 0) ? inc() : dec(); 
    } 
    public static void inc() 
    { 
     num++; 
    } 
    public static void dec() 
    { 
     num--; 
    } 

爲什麼不C#允許我使用三元「:」操作符來檢查條件,然後無需返回任何值,因此運行的方法?等價於這個:

  if (num == 0) inc(); 
      else dec(); 

我不知道,如果在其他語言應用相同的規則,例如,JAVA,C++等..

回答

5

喬恩斯基特的回答是完全記錄,C#語言故意去比C不同的路線++。很難說爲什麼,但我會嘗試,因爲我相信這個問題也值得回答。

C#與C++和Java共享許多語法。在這種情況下,選擇了Java方式。這涉及無法將2 + 2;作爲獨立語句編寫,以及要求三元運算符返回值。

我相信這些決定都與消除無法訪問的代碼有很大關係。 2 + 2中的+運算符可以被優化,因此如果它在代碼中用於任何目的,那麼該目的是不可靠的!靜態分析(編譯錯誤或警告)應理想地告訴你,在這種情況下似乎存在語義問題,並強制你刪除或重寫不可訪問的代碼。

因此,表達式不再是總是語句,並且需要爲Java/C#重新定義C語言,表達式總是返回值並且語句從不返回值。

現在?:if - else至少在它們的典型用途中主要在一個表達和一個表述中有所不同。所以重新定義的語法簡單地選擇禁用無效的三元組,併爲此推薦if-else

2

因爲三元操作符分配基於布爾表達式的值。它的基本C#規範。如果你的方法是無效的返回類型,那麼最好使用if - else或switch case。

int a = true ? 0 : 1; //Always works 

true ? 0 : 1; //This will never work. 

或者你修改了一下例子。

static int num = 0; 

static void Main(string[] args) 
{ 
    num = (num == 0) ? inc(num) : dec(num); 
} 

public static int inc(int lnum) 
{ 
    return lnum + 1; 
} 

public static int dec(int lnum) 
{ 
    return lnum - 1; 
} 
26

爲什麼我不能運行下面的代碼?

因爲您試圖違反語言規範。條件運算符的操作數(C#4規範中的7.14節)必須爲表達式 - 且返回類型爲void的方法的調用顯式爲「僅在語句表達式的上下文中有效」(請參閱C#4規範的第7.1節)。

條件運算符的用途是提供一個表達式,它是基於條件對兩個表達式中的一個進行求值的結果。它是而不是根據條件執行兩個動作中的一個。只需使用if聲明。

同樣條件運算符不自行形成一個有效的聲明,任何超過其他各種運營商做的事:

a + b; // Invalid 
x = a + b; // Valid, assignment expression can be an expression-statement 

明確從規範的第8.6節:

不是所有表情被允許作爲陳述。特別是,僅計算值(將被丟棄)的表達式如x + yx == 1不允許作爲語句。

+0

@imad:我現在沒有時間回答 - 但我建議你拿到C#4語言規範,並在其中閱讀:) –

2

多個字節,但使用這種方法時,它會工作:

static int num = 0; 
static void Main(string[] args) 
{ 
    num = (num == 0) ? inc(num) : dec(num); 
} 
public static int inc(int number) 
{ 
    return number + 1; 
} 
public static int dec(int number) 
{ 
    return number - 1; 
} 
+0

上面的代碼仍然給出錯誤,也許你忘了將void更改爲int – Emo

+0

是的,我忘記了。固定。 –

+0

是的,這將工作。爲什麼?首先,方法不是無效的,但返回值,其次是三元運算符分配回num。 –