原來C#的可空型別可以直接參與計算

邊城發表於2019-02-16

偶然發現一個 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
    }
}

相關文章