1. 程式人生 > >c#:無法將 NULL 轉換成“System.DateTime”,因為它是一種值型別

c#:無法將 NULL 轉換成“System.DateTime”,因為它是一種值型別

摘自:http://www.blogjava.net/parable-myth/archive/2010/09/30/333454.html

在C# 2.0裡面的資料型別中,分為值型別和引用型別,引用型別可以初始化為null,可是值型別是不可以的。

比如經常用到的System.Guid型別,要麼賦值為Guid.NewId,要麼賦值為Guid.Empty。
再比如System.DateTime,預設初始化為DateTime.MinValue。

強行給值型別賦null值,編譯就不會通過,會報出類似下面的異常:
錯誤 1 無法將 NULL 轉換成“System.DateTime”,因為它是一種值型別
這個時候就要藉助Nullable<T>結構體了。

拿DateTime舉例,完整的寫法:
Nullable<DateTime> now = DateTime.Now;
Nullable<DateTime> now = null;
當然也可以縮寫:
DateTime? now = DateTime.Now;
DateTime? now = null;
我們可以直接對now賦值,但實際上是給now.Value賦值。

既然可以為空,就涉及到判斷了,以下兩種方式都是可行的:
if (now != null) {}
if (now.HasValue()) {}
有一點需要注意的是,值型別可以通過這種方法變成引用型別,但是引用型別不可以喲。比如下面這段程式碼:
Nullable<string> test = "ddd";
這段程式碼編譯無法通過,會報出以下異常:
錯誤 1 型別“string”必須是不可為空的值型別才能用作泛型型別或方法“System.Nullable<T>”中的引數“T”