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))); 

原因是条件运算符是特定类型的表达式。 编译器根据运算符的两个分支中的表达式类型来推断此特定类型。
在您的代码中,编译器不能使用此特定类型,因为DBNull.Value_item.Created属于不同_item.Created相关的类型。 您不能将任何一个转换为另一个的类型。

要使其工作,请将至少一个分支强制转换为object

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

使用条件运算符时 , 条件的不同边(true和false分支)返回的两种类型应该相同或者可以隐式地相互转换。

DBNull.ValueDateTime不是这样的值。

改为使用SqlDateTime :

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