我有一个像这样的课程
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'
我在这里缺少什么?
答案 0 :(得分:55)
您需要将null
投射到DateTime?
:
oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value
? (DateTime?)null
: Convert.ToDateTime(dr["AppDate"]);
这是因为编译器确定conditional operator的结果类型的方式;行为是设计的:
first_expression和second_expression的类型必须是 相同,或者必须存在从一种类型到另一种类型的隐式转换。
由于null
本身is of null type并且因此没有转换或来自它,您需要通过强制转换来帮助编译器。
答案 1 :(得分:7)
oMyClass.ApplicationDate =
dr["ApplDate"] == DBNull.Value ?
(DateTime?)null :
Convert.ToDateTime(dr["AppDate"]);
所有编译器都知道,一件事评估为null
而另一件评估为DateTime
。编译器抱怨,因为它无法从一个转换为另一个,因此您可以将它们转换为可以同时为值的东西。
请注意,DateTime?
是Nullable<DateTime>
的缩写
另请注意,您只需要转换空值,因为DateTime?
和DateTime
之间存在隐式转换,因此编译器可以自行执行转换。
答案 2 :(得分:4)
试试这个:
oMyClass.ApplicationDate =
dr["ApplDate"] == DBNull.Value ? (DateTime?)null :
Convert.ToDateTime(dr["AppDate"]);
您还可以将演员表应用于最后一个表达式。
答案 3 :(得分:2)
您需要将“null”转换为Nullable
试试这段代码:
oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value ? (DateTime?)null : Convert.ToDateTime(dr["AppDate"]);
答案 4 :(得分:1)
您可以使用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
答案 5 :(得分:0)
DateTime? dt = (DateTime?)null;
或
Nullable<DateTime> dt = (Nullable<DateTime>)null;