1. 程式人生 > >C#中的?和??,null和Nullable

C#中的?和??,null和Nullable

不能 ron repl 編譯器 提示 data- 外行 date 如果

1.單問號(?)

1.1 單問號運算符可以表示:可為Null類型,C#2.0裏面實現了Nullable數據類型

//A.比如下面一句,直接定義int為null是錯誤的,錯誤提示為無法將null轉化成int,因為後者是不可以為null的值類型。
private int getNum = null;

//B.如果修改為下面的寫法就可以初始指為null,在特定情況下?等同於基礎類型為Nullable。
private int? getNum = null;
private Nullable<int> getNumNull = null;

2.雙問號(??)

?? 運算符稱為 null 合並運算符,用於定義可以為 null 值的類型和引用類型的默認值。如果此運算符的左操作數不為 null,則此運算符將返回左操作數;否則返回右操作數。

可以為 null 的類型可以包含值,或者可以是未定義的。?? 運算符定義當可以為 null 的類型分配給非可以為 null 的類型時返回的默認值。如果在嘗試將可以為 null 值的類型分配給不可以為 null 值的類型時沒有使用 ?? 運算符,則會生成編譯時錯誤。如果使用強制轉換,且當前還未定義可以為 null 值的類型,則會引發InvalidOperationException 異常。

//A.定義getNum為null,輸出結果為0
private int? getNum = null;
Console.WriteLine(getNum ?? 0);

//B.定義getNum為1,輸出結果為1
private int getNum = 1;
Console.WriteLine(getNum ?? 0);

if語句中的time和null比較是否有效? 為什麽?

from:

https://www.jianshu.com/p/cda351b8b770

static DateTime time;
/* ... */
if (time == null)
{
    /* do something */
}

參考答案
有人可能會認為,由於DateTime變量永遠不能為空(它自動初始化為0001年1月1日),因此當DateTime變量與null進行比較時,編譯器會報錯。但是,由於類型轉換,編譯器確實允許它,這可能會導致一些讓你頭疼的問題。

具體來說,==運算符會將等號兩邊的對象都轉換成相同的類型,然後可以進行比較。這就是為什麽像這樣的寫法會給你你期望的結果(而不是因為操作數是不同的類型而導致失敗或表現異常):

double x = 5.0;
int y = 5;
Console.WriteLine(x == y); // 輸出true

但是,這有時會導致意外行為,比如DateTime變量和null的比較。在這種情況下,DateTime變量和null文字都可以強制轉換為Nullable <DateTime>。因此,比較這兩個值是合法的,即使結果總是false。

 

C#中的?和??,null和Nullable