2009-07-07 37 views
124

Quiero convertir un DateTime anulable (DateTime?) a un DateTime, pero estoy consiguiendo un error:Cómo convertir DateTime? a DateTime

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

He intentado lo siguiente:

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

Respuesta

250

que desea utilizar el null-coalescing operator, que está diseñado precisamente para este propósito.

Al usarlo usted termina con este código.

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

aquí hay un fragmento que utilicé dentro de un presentador llenando una vista con una fecha/hora anulable: 'memDateLogin = m.memDateLogin ?? DateTime.MinValue' –

+0

'DateTime?'dosis no contiene definición para' Fecha actualizada ' –

15

es necesario llamar a la Value propiedad del DateTime que admite nulos. Esto devolverá un DateTime.

Suponiendo que UpdatedDate es DateTime?, entonces esto debería funcionar:

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

Para hacer que el código un poco más fácil de leer, se puede utilizar la propiedad HasValue en lugar del cheque null:

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

Esto se puede hacer aún más conciso:

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

+1 para el valor - y por coalescencia nula. –

0

Prueba esto:

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

¿Qué hay de lo siguiente:

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

probar este

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

La clave aquí es el operador nulo-coalescente, vea la respuesta de chills42 más información. – cspolton

72

MS ya hizo un método para esto, por lo que no tiene que usar el operador nulo coalescente. No hay diferencia en la funcionalidad, pero es más fácil para los no expertos obtener lo que está sucediendo de un vistazo.

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

Forma más legible que las otras opciones. – Newbie

+0

Esto ha hecho que mi código sea mucho más legible. – Luke101

4

Aquí hay un fragmento he usado dentro de un presentador de llenar una vista con una fecha anulable/Tiempo

memDateLogin = m.memDateLogin ?? DateTime.MinValue 
3

También puede intentar Nullable(T) Properties:

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

en lugar de usuario del siguiente al de su mucho mejor

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

Se puede utilizar un molde simple:

DateTime dtValue = (DateTime) dtNullAbleSource; 
+3

Perfecto si comprueba si la var es nula antes de +1 –

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

Normalmente se considera buena forma de explicar sus sugerencias/respuestas. Las respuestas de solo código pueden ser sorprendentemente poco informativas, incluso si son técnicamente correctas. –

+0

@MaximilianAst sí tiene razón intentará implementar de la manera que ha sugerido :) –