2017-10-03 2 views
0
DateTime tempDate = calculatesomedatetime(); 
someDateTimeControl.Value = null; //no issue 
someDateTimeControl.Value = (tempDate > DateTime.MinValue)? tempDate : null; 

Type d'expression conditionnelle ne peut être déterminée parce qu'il n'y a pas de conversion implicite entre System.DateTime et nulleType d'expression conditionnelle ne peut être déterminée parce qu'il n'y a pas de conversion implicite entre System.DateTime et nulle

Ligne 3 me jeter une telle erreur que je ne comprends pas que la comparaison est (tempDate > DateTime.MinValue) et null est juste l'attribution de valeur. Pourquoi le compilateur interpréterait-il cela comme une erreur?

Toutefois, si j'écris comme ci-dessous, il n'a pas de problème

if(tempDate > DateTime.MinValue) 
{ 
    someDateTimeControl.Value = tempDate; 
}else 
{ 
    someDateTimeControl.Value = null; 
} 
+0

'DateTime' est un' struct'. Il ne peut pas être affecté à 'null'. Vous devez le déclarer comme 'nullable' (comme:' DateTime? TempDate = ... ') ou utiliser une autre valeur par défaut, comme' DateTime.MinValue'. –

+0

@RufusL: S'il vous plaît se référer à ma line2, le contrôle peut accepter null –

+0

Oh, je dois avoir mal lu initialement, mais le problème est toujours fondamentalement le même. L'opérateur ternaire déduit le type retourné par la première partie, qui est un 'DateTime'. Vous devez toujours définir 'tempDate' comme nulle, ou le convertir en null dans l'expression ternaire. –

Répondre

5

Le problème est dû à l'opération ternaire. Vous modifiez le type de données de DateTime à DateTime nullable. Les opérations ternaires nécessitent que vous retourniez le même type de données avant et après le deux-points. Faire quelque chose comme cela fonctionnerait:

someDateTimeControl.Value = (tempDate > DateTime.MinValue) ? (DateTime?)tempDate : null; 
1

Cast deux côtés à un nullable DateTime, de cette façon, il renvoie le même type sur les deux côtés.

someDateTimeControl.Value = (tempDate > DateTime.MinValue)? (DateTime?)tempDate : (DateTime?)null;