¿Problema de tipo anulable con?: Operador condicional

¿Alguien podría explicar por qué esto funciona en C # .NET 2.0:

Nullable foo; if (true) foo = null; else foo = new DateTime(0); 

… pero esto no:

  Nullable foo; foo = true ? null : new DateTime(0); 

Este último formulario me da un error de comstackción “El tipo de expresión condicional no se puede determinar porque no hay una conversión implícita entre ” y ‘System.DateTime’.”

No es que no pueda usar el primero, pero el segundo estilo es más consistente con el rest de mi código.

Esta pregunta ya se ha hecho varias veces. El comstackdor le dice que no sabe cómo convertir null en DateTime .

La solución es simple:

 DateTime? foo; foo = true ? (DateTime?)null : new DateTime(0); 

Tenga en cuenta que Nullable se puede escribir DateTime? que te ahorrará un montón de tipeo.

FYI (Offtopic, pero ingenioso y relacionado con tipos anulables) tenemos un operador útil solo para tipos anulables llamado el operador nulo coalescente

 ?? 

Usado así:

 // Left hand is the nullable type, righthand is default if the type is null. Nullable foo; DateTime value = foo ?? new DateTime(0); 

Es porque en un operador ternario, los dos valores deben resolverse con el mismo tipo.

Otra solución similar a la aceptada es usar la palabra clave default C #. Si bien se define utilizando generics, en realidad es aplicable a cualquier tipo.

Ejemplo de uso aplicado a la pregunta del OP:

 Nullable foo; foo = true ? default(DateTime) : new DateTime(0); 

Ejemplo de uso con la respuesta aceptada actual:

 DateTime? foo; foo = true ? default(DateTime) : new DateTime(0); 

Además, al usar el default , no necesita especificar la variable como nullable para asignarle un valor null . El comstackdor asignará automáticamente el valor predeterminado del tipo de variable específico y no se encontrará ningún error. Ejemplo:

 DateTime foo; foo = true ? default(DateTime) : new DateTime(0); 

Sé que esta pregunta fue hecha en 2008 y ahora es 5 años más tarde, pero la respuesta marcada como respuesta no me satisface. La respuesta real es que DateTime es una estructura, y como una estructura no es compatible con null. Tienes dos maneras de resolver eso:

Lo primero es hacer que null sea compatible con DateTime (por ejemplo, lanzar null en DateTime ?, como sugiere el caballero con 70 upvotes, o emitir nulo en Object o ValueType).

El segundo es hacer compatible DateTime con null (por ejemplo, lanzar DateTime a DateTime?).