2012-10-12 10 views
15

Mam klasy jak tenPrzypisanie `wartość null` do pustych <DateTime> z jednej linii„if”

public class MyClass 
{ 
    public int Id { get; set; } 
    public Nullable<DateTime> ApplicationDate { get; set; } 
    .... 
} 

Teraz próbuję wypełnić obiekt MyClass tak

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 
.... 

Przypisanie wartości daty aplikacji daje błąd

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

Czego mi tu brakuje?

Odpowiedz

46

Trzeba rzucić null do DateTime?:

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

To ze względu na sposób kompilator określa wynikowy typ conditional operator; zachowanie jest wzorem:

czy typ first_expression i second_expression muszą być takie same, albo ukryte konwersji musi istnieć z jednego na drugi.

Od null przez siebie is of null type i tym samym nie ma konwersję z lub do niego, trzeba pomóc kompilator przez odlewanie.

+0

nie 'null' muszą być lanego, jak również? Wygląda na to, że komunikat o błędzie dotyczy 'null' i' System.DateTime'. – Default

+1

@Default: Tak, '' null' jest tym, co należy rzucić, moje złe. – Jon

+0

Otrzymuję 'obiekt Nullable musi mieć wartość' podczas robienia czegoś podobnego do tej i tych odpowiedzi na tej stronie, łącznie z rzutem' (DateTime?) Null'. – vapcguy

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

Wszystko kompilator wie, że jest jedna rzecz ocenia na null i innymi wynikiem jest DateTime. Kompilator narzeka, ponieważ nie może przekonwertować go z jednego na drugi, więc to od Ciebie zależy, czy rzucisz je na coś, co może być obie wartości.

Należy pamiętać, że DateTime? jest skrótem od Nullable<DateTime>.
Należy również pamiętać, że wystarczy rzucić wartość pustą, ponieważ istnieje niejawna konwersja między DateTime? i DateTime, aby kompilator mógł wykonać tę konwersję samodzielnie.

3

spróbuj tego:

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

Można zastosować również do obsady do ostatniej wypowiedzi.

1

będzie trzeba konwertować "null" do Nullable

Spróbuj kod:

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

lub

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

można użyć default które przypisać wartość domyślną niezainicjowanego typu.

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

Więcej przykładów

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 
Powiązane problemy