2012-12-03 42 views
1

有沒有人有一個想法,爲什麼這個工程:DateTime和DbNull.Value

if (_item.Created == DateTime.MinValue) 
{ 
    ListSqlParam.Add(new SqlParameter("@TransactionCreated", DBNull.Value)); 
} 
else 
{ 
    ListSqlParam.Add(new SqlParameter("@TransactionCreated", _item.Created)); 
} 

但不是這樣的:

ListSqlParam.Add(new SqlParameter("@TransactionCreated",((_item.Created == DateTime.MinValue) ? DBNull.Value : _item.Created))); 
+0

什麼不工作在第二種情況下? – ryadavilli

+1

@ryadavilli - 它不會編譯。 – Oded

+0

'DBNull.Value'與'_item.Created'不是同一個類型。 – Bridge

回答

0

當使用conditional operator,由條件的不同側面返回兩種類型(真實和錯誤的分支)應該是相同的或者可以隱含地相互轉換。

DBNull.ValueDateTime不是這樣的值。

3

原因是條件運算符是特定類型的表達式。編譯器根據操作符的兩個分支中的表達式的類型來引用此特定類型。
在您的代碼中,編譯器無法傳遞此特定類型,因爲DBNull.Value_item.Created是不同且不相關的類型。你不能將任何一個投射到另一個的類型。

要使其工作,投下至少一個分支object

(_item.Created == DateTime.MinValue) ? (object)DBNull.Value : _item.Created 
0

使用SqlDateTime代替:

_item.Created == DateTime.MinValue ? SqlDateTime.Null : new SqlDateTime(_item.Created)