2016-04-27 118 views
2

爲什麼第一個測試會引發編譯器錯誤,而第二個測試不會呢?對我來說,他們似乎語義上相同。爲什麼這兩個表達式在語義上不相等?

public bool? inlineTest(bool input) 
{ 
    return input ? null : input; 
} 

public bool? expandedTest(bool input) 
{ 
    if (input) 
     return input; 
    else 
     return null; 
} 

回答

9

條件運算符要求兩個操作數都是相同的類型。 nullbool不兼容,並且沒有自動boolnull的轉換。你需要明確地投:

return input ? (bool?)input : null; 

在另一方面,有一個自動轉換從boolbool?,也從nullbool?,這就是爲什麼你可以從bool?方法返回一個boolnull

+0

ExpandedTest的等價物是不是'返回輸入? (bool?)input:null;'? – Fermin

+0

@Fermin:你說得對,條件中的邏輯是倒置的。我複製了來自OP的代碼。現在修復。 – knittl

4

類型推理規則規定:

要麼first_expression和second_expression的類型必須是 相同,或隱式轉換必須存在從一種類型到另一個。

所以編譯器能夠推斷出類型,如bool?

此類型推斷不會發生在if語句中,因此您的工作是明確說明類型。

1

兩個操作數在使用條件運算符時應該具有相同的數據類型。

相關問題