偶然發現一個 decimal?
型別的資料直接參與計算並沒有報語法錯誤。以為是 Visual Studio 2015 中 C#6.0 的“空值判斷”特性。為了避免在構建伺服器的 Visual Studio 2013 環境下不能編譯通過,所以特別用 Visual Studio 2013 重新開啟專案觀察,發一居然仍然沒有語法錯誤。
看來 Nullable<>
參與運算是 C# 一早就支援的語法,但是我需要證明。於是去翻 MSDN,在 Using Nullable Types (C# Programming Guide).aspx) 找到了答案。
The predefined unary and binary operators and any user-defined operators that exist for value types may also be used by nullable types. These operators produce a null value if the operands are null; otherwise, the operator uses the contained value to calculate the result.
就是說,一元/二元運算子和使用者自定義的運算子可用於可空型別。當運算元是 null
是時候,運算結果為 null
,否則用可空型別包含的值來進行計算。
嘿,長知識了!
不過 bool?
的位運算結果有點特殊,所以 MSDN 用了一個表格來列舉運算結果,當然,我只關心有 null
參與運算的情況,所以其它情況就不列了
x | y | x&y | x | y |
---|---|---|---|---|
true |
null |
null |
true |
|
false |
null |
false |
null |
|
null |
true |
null |
true |
|
null |
false |
false |
null |
|
null |
null |
null |
null |
不過畢竟布林用於位運算的時候還是少,多數時候是用於布林運算——很不幸,bool?
不能參與布林運算,也不能用於 if
語句。如果需要,應該根據上下文邏輯,進行判斷或者轉換,比如
void Test(bool? v) {
if (v.HasValue) {
if (v) {
// v is true
} else {
// v is false
}
} else {
// v is null
}
}
void Test(bool? v) {
// 如果 null 當 false 處理
if (v ?? false) {
// v is true
}
// 如果 null 當 true 處理
if (v ?? true) {
// v is true or null
}
}