¿Podría alguien explicar por qué esto funciona en C # .NET 2.0:
Nullable<DateTime> foo;
if (true)
foo = null;
else
foo = new DateTime(0);
... pero esto no:
Nullable<DateTime> foo;
foo = true ? null : new DateTime(0);
El último formulario me da un error de compilación "El tipo de expresión condicional no se puede determinar porque no hay conversión implícita entre '<null>' y 'System.DateTime'".
No es que no pueda usar el primero, pero el segundo estilo es más consistente con el resto de mi código.
c#
generics
nullable
conditional-operator
Nick Gotch
fuente
fuente

Respuestas:
Esta pregunta ya se ha hecho muchas veces. El compilador te dice que no sabe cómo convertir
nullaDateTime.La solución es simple:
Tenga en cuenta que
Nullable<DateTime>se puede escribir loDateTime?que le ahorrará un montón de mecanografía.fuente
<null>y, enDateTimelugar de encontrar el tipo de ancestro común, solo trata de encontrar una conversión entre ellos. (Bit extra: C # reconoce un<null>tipo, es decir, el tipo de cadanullexpresión.)Para su información (Offtopic, pero ingenioso y relacionado con tipos anulables) tenemos un operador útil solo para tipos anulables llamado operador de fusión nula
Usado así:
fuente
Es porque en un operador ternario, los dos valores deben resolverse en el mismo tipo.
fuente
Sé que esta pregunta se hizo en 2008 y ahora es 5 años después, pero la respuesta marcada como una respuesta no me satisface. La respuesta real es que DateTime es una estructura, y como estructura no es compatible con nulo. Tienes dos formas de resolver eso:
Primero, hacer que null sea compatible con DateTime (por ejemplo, ¿convertir nulo en DateTime? Como sugiere el caballero con 70 votos a favor, o convertir nulo en Object o ValueType).
El segundo es hacer que DateTime sea compatible con nulo (por ejemplo, ¿convertir DateTime a DateTime?).
fuente
Otra solución similar a la aceptada es usar C # 's
defaultpalabra clave de . Si bien se define utilizando genéricos, en realidad es aplicable a cualquier tipo.Ejemplo de uso aplicado a la pregunta del OP:
Ejemplo de uso con la respuesta aceptada actual:
Además, mediante el uso
default, no necesita especificar la variablenullablepara asignarle unnullvalor. El compilador asignará automáticamente el valor predeterminado del tipo de variable específico y no se encontrará ningún error. Ejemplo:fuente
default(DateTime)no es nulo, es "1.1.0001 0:00:00", lo mismo quenew DateTime(0).null, solo que al usarlodefault()puedes asignarlo a unnullablevalor (como dice MSDN). Los ejemplos que muestro demuestran la versatilidad que se puede utilizar conNullable<DateTime>,DateTime?y simplementeDateTime. Si cree que esto es incorrecto, ¿puede proporcionar un PoC donde estos fallan?nullen la variable, nodefault(DateTime), así que esto es engañoso en el mejor de los casos. Esto no es "versátil" como implica, ya que la expresión en su conjunto todavía tiene el mismo tipoDateTime, y puede reemplazardefault(DateTime)connew DateTime()y hará lo mismo. Tal vezdefault(DateTime?)es a lo que te refieres, ya que en realidad es igual anull.