Назначение значения "null" для Nullable <DateTime> с одной строкой 'if'

У меня есть класс вроде этого

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'

Что мне здесь не хватает?

Ответы

Ответ 1

Вам нужно отбрасывать null в DateTime?:

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

Это связано с тем, как компилятор определяет результирующий тип условного оператора ; поведение по дизайну:

Любой тип выражения first_expression и second_expression должен быть то же самое, или неявное преобразование должно существовать от одного типа к другому.

Поскольку null сам по себе имеет нулевой тип и, следовательно, нет никакого преобразования из или в него, вам нужно помочь компилятору путем кастинга.

Ответ 2

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

Все компиляторы знают, что одна вещь оценивает null, а другая оценивает DateTime. Компилятор жалуется, потому что он не может преобразовать один из другого в другой, чтобы вы могли применить их к чему-то, что может быть обоими значениями.

Обратите внимание, что DateTime? не подходит для Nullable<DateTime>.
Также обратите внимание, что вам нужно всего лишь указать нулевое значение, поскольку существует неявное преобразование между DateTime? и DateTime, поэтому компилятор может сделать это преобразование самостоятельно.

Ответ 3

попробуйте следующее:

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

Вы также можете применить бросок к последнему выражению.

Ответ 4

Вам нужно будет преобразовать "null" в Nullable

Попробуйте этот код:

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

Ответ 5

DateTime? dt = (DateTime?)null;

или

Nullable<DateTime> dt = (Nullable<DateTime>)null;

Ответ 6

Вы можете использовать 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