爲什麼第一個測試會引發編譯器錯誤,而第二個測試不會呢?對我來說,他們似乎語義上相同。爲什麼這兩個表達式在語義上不相等?
public bool? inlineTest(bool input)
{
return input ? null : input;
}
public bool? expandedTest(bool input)
{
if (input)
return input;
else
return null;
}
爲什麼第一個測試會引發編譯器錯誤,而第二個測試不會呢?對我來說,他們似乎語義上相同。爲什麼這兩個表達式在語義上不相等?
public bool? inlineTest(bool input)
{
return input ? null : input;
}
public bool? expandedTest(bool input)
{
if (input)
return input;
else
return null;
}
條件運算符要求兩個操作數都是相同的類型。 null
和bool
不兼容,並且沒有自動從bool
到null
的轉換。你需要明確地投:
return input ? (bool?)input : null;
在另一方面,有一個自動轉換從bool
到bool?
,也從null
到bool?
,這就是爲什麼你可以從bool?
方法返回一個bool
和null
。
類型推理規則規定:
要麼first_expression和second_expression的類型必須是 相同,或隱式轉換必須存在從一種類型到另一個。
所以編譯器能夠推斷出類型,如bool?
。
此類型推斷不會發生在if
語句中,因此您的工作是明確說明類型。
兩個操作數在使用條件運算符時應該具有相同的數據類型。
ExpandedTest的等價物是不是'返回輸入? (bool?)input:null;'? – Fermin
@Fermin:你說得對,條件中的邏輯是倒置的。我複製了來自OP的代碼。現在修復。 – knittl