web-dev-qa-db-fra.com

Affectation de la valeur null à Nullable <DateTime> avec une seule ligne 'if'

J'ai une classe comme ça

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

Maintenant, j'essaie de remplir un objet de MyClass comme ceci

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

L'affectation de la valeur de la date d'application donne une erreur

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

Qu'est-ce que j'oublie ici?

17
Nalaka526

Vous devez convertir null en DateTime?:

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

Cela est dû à la manière dont le compilateur détermine le type résultant de l'opérateur conditionnel ; le comportement est par conception:

Soit les types first_expression et second_expression doivent être identiques à , Soit une conversion implicite doit exister d'un type à l'autre.

Étant donné que null par lui-même est de type null et qu’il n’ya donc aucune conversion, vous devez aider le compilateur en convertissant.

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

Tout ce que le compilateur sait, c’est qu’une chose est évaluée à null et l’autre à DateTime. Le compilateur se plaint parce qu'il ne peut pas convertir de l'un à l'autre, il vous appartient donc de les attribuer à quelque chose qui peut être les deux valeurs.

Notez que DateTime? est l'abréviation de Nullable<DateTime>.
Notez également qu'il vous suffit de convertir la valeur null car il existe une conversion implicite entre DateTime? et DateTime pour que le compilateur puisse effectuer cette conversion elle-même.

7
George Duckett

essaye ça: 

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

Vous pouvez également appliquer le casting à la dernière expression. 

4
Botz3000

Vous devrez convertir "null" en Nullable

Essayez ce code:

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

Vous pouvez utiliser default qui affectera la valeur par défaut d'un type non initialisé.

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

Plus d'exemples

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
1
civilator
DateTime? dt = (DateTime?)null;

ou

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