31

我有这样的课

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'

我在这里想念什么?

4

6 回答 6

74

您需要转换nullDateTime?

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

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

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

由于null它本身是 null 类型,因此没有从它或到它的转换,你需要通过强制转换来帮助编译器。

于 2012-10-12T08:28:33.997 回答
7
oMyClass.ApplicationDate =
    dr["ApplDate"] == DBNull.Value ?
    (DateTime?)null :
    Convert.ToDateTime(dr["AppDate"]);

编译器所知道的是,一件事的计算结果为 a ,另一件事的计算null结果为 a DateTime。编译器会抱怨,因为它无法从一个转换为另一个,因此您可以将它们转换为可以同时是两个值的东西。

请注意,它DateTime?Nullable<DateTime>.
另请注意,您只需要转换空值,因为两者之间存在隐式转换DateTime?DateTime因此编译器可以自行进行转换。

于 2012-10-12T08:28:17.417 回答
4

试试这个:

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

您还可以将强制转换应用于最后一个表达式。

于 2012-10-12T08:28:42.423 回答
4

您可以使用defaultwhich 将分配未初始化类型的默认值。

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
于 2017-12-19T20:54:46.487 回答
2

您需要将“null”转换为 Nullable

试试这个代码:

oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value ? (DateTime?)null : Convert.ToDateTime(dr["AppDate"]);
于 2012-10-12T08:30:52.033 回答
0
DateTime? dt = (DateTime?)null;

或者

Nullable<DateTime> dt = (Nullable<DateTime>)null;
于 2017-03-01T09:40:05.063 回答