2009-07-07 16 views
124

voglio convertire un DateTime nullable (DateTime?) per un DateTime, ma sto ottenendo un errore:Come convertire DateTime? a DateTime

"Cannot implicitly convert type 'System.DateTime?' to 'System.DateTime'. An explicit conversion exists (are you missing a cast?)" 

ho tentato il seguente:

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

risposta

250

Si desidera utilizzare il null-coalescing operator, che è stato progettato proprio per questo scopo.

Usandolo si finisce con questo codice.

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now; 
+0

ecco uno snippet che ho usato all'interno di un Presenter per riempire una vista con una data/ora Nullable: 'memDateLogin = m.memDateLogin ?? DateTime.MinValue' –

+0

'DateTime?'dose non contiene la definizione' Data aggiornamento ' –

15

è necessario chiamare il Value proprietà di DateTime nullable. Ciò restituirà un DateTime.

Supponendo che UpdatedDate è DateTime?, allora questo dovrebbe funzionare:

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

per rendere il codice un po 'più facile da leggere, è possibile utilizzare la proprietà al posto del controllo nullHasValue:

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

Questo può essere reso ancora più conciso:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now; 
+0

+1 per Value - e per null coalescenza. –

0

Prova questa:

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

Come circa la seguente:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue ? _objHotelPackageOrder.UpdatedDate.value : DateTime.Now; 
39

Prova questa

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now; 
+0

La cosa fondamentale qui è l'operatore a coalescenza nulla, vedere la risposta di chills42 maggiori informazioni. – cspolton

72

MS ha già creato un metodo per questo, quindi non è necessario utilizzare l'operatore null coalescente. Nessuna differenza di funzionalità, ma è più facile per i non esperti ottenere ciò che sta accadendo a colpo d'occhio.

DateTime updatedTime = _objHotelPackageOrder.UpdatedDate.GetValueOrDefault(DateTime.Now); 
+1

Più leggibile rispetto alle altre opzioni. – Newbie

+0

Ciò ha reso il mio codice molto più leggibile. – Luke101

4

Ecco un frammento che ho usato all'interno di un presentatore riempire una vista con un Nullable data/ora

memDateLogin = m.memDateLogin ?? DateTime.MinValue 
3

Si può anche provare Nullable(T) Properties:

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

piuttosto all'utente il successivo alla molto meglio

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

È possibile utilizzare un semplice getto:

DateTime dtValue = (DateTime) dtNullAbleSource; 
+3

Perfetto se si controlla se var è nullo prima del +1 –

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

È normale considerato una buona forma per spiegare i vostri suggerimenti/risposte. Le risposte al solo codice possono essere sorprendentemente disinformative, anche se tecnicamente corrette. –

+0

@MaximilianAst si hai ragione proverà a implementare il modo in cui hai suggerito :) –