visual usar unario solo operadores operador condicionales condicional como asignacion c# generics nullable conditional-operator

c# - usar - ¿Problema de tipo anulable con?: Operador condicional



operadores de asignacion en c# (5)

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

¿Alguien podría 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);

Este último formulario me da un error de compilación "El tipo de expresión condicional no se puede determinar porque no hay una 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.


Esta pregunta ya se ha hecho varias veces. El compilador 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<DateTime> 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<DateTime> foo; DateTime value = foo ?? new DateTime(0);


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

Ejemplo de uso aplicado a la pregunta del OP:

Nullable<DateTime> 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 compilador 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?).