2012-10-12 59 views
15

我有這樣分配`null`值可空<DateTime>使用單線「如果」

public class MyClass 
{ 
    public int Id { get; set; } 
    public Nullable<DateTime> ApplicationDate { get; set; } 
    .... 
} 

一類現在我試圖填補MyClass對象這樣

DataTable dt = DBHelper.GetDataTable(sql, conn); 
DataRow dr = dt.Rows[0]; 

MyClass oMyClass = new MyClass(); 
oMyClass.Id = (int)dr["Id"]; 
oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value ? null : Convert.ToDateTime(dr["AppDate"]); 
//Above line gives an error 
.... 

應用日期值的賦值給出了一個錯誤

Type of conditional expression cannot be determined because there is no implicit conversion between '<null>' and 'System.DateTime'

我在這裏錯過了什麼?

回答

46

你需要投nullDateTime?

oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value 
    ? (DateTime?)null 
    : Convert.ToDateTime(dr["AppDate"]); 

這是因爲編譯器確定所導致的conditional operator類型的方式;該現象是由設計:

要麼first_expression和second_expression的類型必須是 相同,或隱式轉換必須存在從一種類型到另一個。

由於null本身is of null type,因此有來自或到其沒有轉換,則需要通過轉換成幫助編譯器。

+0

不會'null'必須鑄造呢?看起來錯誤信息涉及'null'和'System.DateTime'。 – Default

+1

@Default:是'null'是需要投的東西,我的不好。 – Jon

+0

在做類似於這個和這個頁面上的這些答案時,我得到'Nullable對象必須有一個值',包括'(DateTime?)null'。 – vapcguy

6
oMyClass.ApplicationDate = 
    dr["ApplDate"] == DBNull.Value ? 
    (DateTime?)null : 
    Convert.ToDateTime(dr["AppDate"]); 

所有的編譯器知道是一回事計算結果爲null和其他計算結果爲DateTime。編譯器會抱怨,因爲它不能從一個轉換到另一個,所以你可以將它們轉換爲可以同時存在的值。

請注意DateTime?Nullable<DateTime>的簡稱。
另請注意,由於在DateTime?DateTime之間存在隱式轉換,因此編譯器可以對其自身進行轉換,因此只需轉換空值即可。

3

試試這個:

oMyClass.ApplicationDate = 
    dr["ApplDate"] == DBNull.Value ? (DateTime?)null : 
            Convert.ToDateTime(dr["AppDate"]); 

您還可以將投最後表達。

1

您將需要轉換的 「空」 爲可空

試試這個代碼:

oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value ? (DateTime?)null : Convert.ToDateTime(dr["AppDate"]); 
0
DateTime? dt = (DateTime?)null; 

Nullable<DateTime> dt = (Nullable<DateTime>)null; 
0

您可以使用default將指定默認值未初始化的類型。

oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value ? default(Nullable<DateTime>) : Convert.ToDateTime(dr["AppDate"]); 

更多的例子

bool isHappy = default(bool); //isHappy = false 
int number = default(int); //number = zero 
string text = default(text); // text = null 
MyObject myObject = default(MyObject); // myObject = null 
DateTime? date = default(DateTime?); //date = null 
相關問題