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?
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.
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.
essaye ça:
oMyClass.ApplicationDate =
dr["ApplDate"] == DBNull.Value ? (DateTime?)null :
Convert.ToDateTime(dr["AppDate"]);
Vous pouvez également appliquer le casting à la dernière expression.
Vous devrez convertir "null" en Nullable
Essayez ce code:
oMyClass.ApplicationDate = dr["ApplDate"] == DBNull.Value ? (DateTime?)null : Convert.ToDateTime(dr["AppDate"]);
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
DateTime? dt = (DateTime?)null;
ou
Nullable<DateTime> dt = (Nullable<DateTime>)null;