由於一個實值型別變數永遠不可能為null,而資料庫中的一個列是允許值為空白的,為了與資料庫中的列相對應,CLR引入了可空實值型別。
C#中是以問號標記法聲明並初始化可空實值型別的,如下代碼所示:
#001 int? x=5; #002 int? y=null; |
C#允許對可空實值型別進行資料轉換和轉型,範例程式碼如下:
#001 int? x=5; #002 int z =(int)x; |
可以對可空實值型別進行裝箱。其規則是:若可空實值型別為null,CLR不進行裝箱操作並返回null值,若不為null,則進行裝箱。範例程式碼如下:
#001 static void NullToObject() #002 { #003 int? b =null; #004 Object o =b; #005 Console.WriteLine("o is null={0}",o==null);//結果o is null=Ture #006 b=5; #007 o=b; #008 Console.WriteLine("o’s type={0}",o.GetType()); #009 //結果o’s type=System.Int32 #010 } |
這個樣本的中如果第一個結果o is null=True,則馬上調用o.GetType()的時候將報錯。
可以對可空實值型別進行拆箱。CLR允許將一個已裝箱的實值型別T拆箱為一個T或一個Nullable<T>,範例程式碼如下:
#001 static void ObjectToNull() #002 { #003 Object o =5; #004 int? a=(int?)o; #005 int b=(int)o; #006 Console.WriteLine("a={0},b={1}",a,b); //結果a=5,b=5 #007 o=null; #008 a=(int?)o; #009 } |
如果在第八行下面添加b=(int)o;這樣就會報Null 參考異常錯誤。
通過可空實值型別來調用GetType()方法,會發現得到的結果是System.Int32類型,而不是Systems.Nullable<Int32>類型。
通過可空實值型別調用介面方法時,Nullable沒有像Int32一樣實現IComparable介面,但CLR允許下面的代碼通過編譯。
#001 static void NullUseInterface() #002 { #003 int? a=5; #004 int b=((IComparable)a).CompareTo(5); //能通過編譯 #005 Console.WriteLine(b);//結果為0 #006 } |