在處理可空類型時,理解它們在表達式中與其他數據類型的兼容性至關重要。一個常見的場景會導致意外錯誤,那就是將三元運算符與可空類型和非可空類型一起使用。
考慮以下代碼片段:
int? x = GetBoolValue() ? 10 : null;
這裡的目標是:如果 GetBoolValue()
返回 true
,則將值 10 賦給可空整數 x
;否則,x
保持為 null
。但是,編譯器會標記一個錯誤:
<code>错误:无法确定条件表达式的类型,因为在 int 和 <null> 之间没有隐式转换。</code>
問題解讀
此錯誤突出了三元表達式中類型不匹配的問題。左側表達式 GetBoolValue()
返回一個 bool
值,解析為 true
或 false
。右側表達式嘗試組合兩個表達式:
10
,這是一個 int
字面量(不是 int?
)。 null
,這是一個空字面量。 編譯器首先嘗試評估右側表達式。它遇到 int
字面量 10
和空字面量 null
,它們是類型不兼容的。 int
和 null
之間沒有定義隱式轉換,導致類型不兼容錯誤。
解決類型不匹配
為了解決這個問題,需要使右側表達式與可空類型兼容。有幾種方法:
將字面量強制轉換為 int?
:
x = GetBoolValue() ? (int?)10 : null;
使用空字面量或默認值:
x = GetBoolValue() ? 10 : (int?)null; x = GetBoolValue() ? 10 : default(int?);
隱式轉換
在已接受的答案中提到的隱式轉換是:
int?
到 null
: 可空類型 int?
可以隱式轉換為 null
。 int
到 int?
: 非可空 int
可以隱式轉換為可空 int?
。 通過使右側表達式與可空類型兼容,您可以解決類型不匹配問題,並根據 GetBoolValue()
的返回值分配適當的值。
以上是為什麼'?10:null”在C#中失敗的類型失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!