使用单行"if"为Nullable <DateTime>分配"null"值

Nal*_*526 21 c# null datetime

我有一个像这样的班级

public class MyClass
{
    public int Id { get; set; }
    public Nullable<DateTime> ApplicationDate { get; set; }
    ....
}
Run Code Online (Sandbox Code Playgroud)

现在我试图填补的对象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
....
Run Code Online (Sandbox Code Playgroud)

分配应用程序日期值会出错

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

我在这里错过了什么?

Jon*_*Jon 59

你需要施放nullDateTime?:

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

这是因为编译器确定条件运算符的结果类型的方式; 行为是设计的:

first_expression和second_expression的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换.

因为null它本身是null类型,因此没有转换或者转换它,你需要通过强制转换来帮助编译器.


Geo*_*ett 7

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

所有编译器都知道,有一件事评估为a null而另一件事评估为a DateTime.编译器抱怨,因为它无法从一个转换为另一个,因此您可以将它们转换为可以同时为值的东西.

请注意,这DateTime?是简称Nullable<DateTime>.
另请注意,您只需要转换null值,因为之间存在隐式转换DateTime?,DateTime因此编译器可以自行执行该转换.