Comment convertir DateTime? à DateTime

171

Je veux convertir un DateTime ( DateTime?) nullable en a DateTime, mais j'obtiens une erreur:

Impossible de convertir implicitement le type "System.DateTime?" à «System.DateTime». Une conversion explicite existe (vous manquez un casting?)

J'ai tenté ce qui suit:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : _objHotelPackageOrder.UpdatedDate;
Waheed
la source

Réponses:

304

Vous souhaitez utiliser l' opérateur null-coalescing , qui est conçu exactement dans ce but.

En l'utilisant, vous vous retrouvez avec ce code.

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
frissons42
la source
1
voici un extrait que j'ai utilisé dans un présentateur remplissant une vue avec une date / heure Nullable: memDateLogin = m.memDateLogin ?? DateTime.MinValue
Ravi Ram
"DateHeure?" la dose ne contient pas la définition de 'Mise à jourDate'
Vasil Valchev
88

MS a déjà créé une méthode pour cela, vous n'avez donc pas à utiliser l'opérateur de fusion nul. Aucune différence de fonctionnalité, mais il est plus facile pour les non-experts de comprendre ce qui se passe en un coup d'œil.

DateTime updatedTime = _objHotelPackageOrder.UpdatedDate.GetValueOrDefault(DateTime.Now);
Josh
la source
43

Essaye ça

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
Valentin Vasilyev
la source
L'essentiel ici est l'opérateur de fusion nul, voir la réponse de chills42 pour plus d'informations.
cspolton
24

Vous pouvez utiliser une distribution simple:

DateTime dtValue = (DateTime) dtNullAbleSource;

Comme l'a dit Leandro Tupone, vous devez vérifier si le var est nul avant

César León
la source
6
Parfait si vous vérifiez si la var est nulle avant +1
Leandro
22

Vous devez appeler la propriété Value du DateTime nullable. Cela renverra un DateTime.

En supposant que UpdatedDatec'est le cas DateTime?, cela devrait fonctionner:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;

Pour rendre le code un peu plus facile à lire, vous pouvez utiliser la propriété HasValue au lieu de la nullvérification:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue
                          ? _objHotelPackageOrder.UpdatedDate.Value
                          : DateTime.Now;

Cela peut alors être rendu encore plus concis:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
Adrianbanks
la source
6

Que diriez-vous de ce qui suit:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue ? _objHotelPackageOrder.UpdatedDate.value : DateTime.Now;
Simon Wilson
la source
6

Voici un extrait que j'ai utilisé dans un présentateur remplissant une vue avec une date / heure Nullable

memDateLogin = m.memDateLogin ?? DateTime.MinValue
Ravi Ram
la source
3

Vous pouvez également essayer les propriétés Nullable (T) :

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue 
    ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;
Mateusz Rogulski
la source
1

Pensez à utiliser ce qui suit qui est bien meilleur que la réponse acceptée

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : (DateTime)_objHotelPackageOrder.UpdatedDate;
Sadiqabbas Hirani
la source
Voulez-vous dire pourquoi c'est mieux?
n4rzul
0

Essaye ça:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;
Tim S. Van Haren
la source
0
DateTime UpdatedTime = _objHotelPackageOrder.HasValue ? _objHotelPackageOrder.UpdatedDate.Value : DateTime.Now;
Harsh Vyas
la source
4
C'est normalement considéré comme une bonne forme pour expliquer vos suggestions / réponses. Les réponses au code uniquement peuvent être étonnamment peu informatives, même si elles sont techniquement correctes.
Maximilian Ast
1
@MaximilianAst oui vous avez raison essaiera de mettre en œuvre la manière que vous avez suggérée :)
Harsh Vyas