¿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
null
aDateTime
.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, enDateTime
lugar 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 cadanull
expresió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
default
palabra 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 variablenullable
para asignarle unnull
valor. 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 unnullable
valor (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?null
en 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
.