Yo esperaría que los próximos tres líneas de código a ser la misma:usando coalescencia operador nulo en los tipos anulables cambia implícita tipo
public static void TestVarCoalescing(DateTime? nullableDateTime)
{
var dateTimeNullable1 = nullableDateTime.HasValue ? nullableDateTime : DateTime.Now;
var dateTimeNullable2 = nullableDateTime != null ? nullableDateTime : DateTime.Now;
var dateTimeWhatType = nullableDateTime ?? DateTime.Now;
}
En todos los casos, asigno nullableDateTime
a la nueva variable. Esperaría que el tipo de todas las variables se convierta en DateTime?
ya que ese es el tipo de nullableDateTime
. Pero para mi sorpresa, el tipo de dateTimeWhatType
se convierte en DateTime
, por lo que no se puede anotar.
Para empeorar las cosas, ReSharper sugiere sustituir la segunda declaración con una expresión nula coalescencia, convirtiéndola en la expresión 3. Así que si dejo que ReSharper haga su trabajo, el tipo de la variable cambiará de DateTime?
a DateTime
.
De hecho, digamos que en el resto del método, me gustaría utilizar
if (someCondition) dateTimeNullable2 = null;
que compile bien, hasta que dejo que ReSharper reemplazar la segunda expresión con la versión coalescente nula.
AFAIK, reemplazando
somevar != null ? somevar : somedefault;
con
somevar ?? somedefault;
de hecho debe producir el mismo resultado. Pero para la tipificación implícita en un tipo que admite nulos, el compilador parece amenazar ??
como si eso significara.
somevar != null ? somevar.Value : somedefault;
así que supongo que mi pregunta es ¿por qué el tipo implícito se cambia cuando uso ??
, y también donde en la documentación que pude encontrar información sobre esto.
Por cierto, este no es un escenario del mundo real, pero me gustaría saber por qué el uso de ??
cambia el tipo (implícito).
¿Por qué esperaría 'nullableDateTime ?? DateTime.Now' para producir un 'DateTime?', Cuando el compilador tiene suficiente información para saber que el resultado nunca será 'nulo'? –
@Damien: en mi primer y segundo ejemplo, el compilador también tiene información suficiente para saber que el resultado nunca será 'nulo'. Esa es exactamente la razón por la que encuentro este comportamiento algo extraño. – comecme
Pero '?: 'admite un rango mucho más grande de posibles entradas (no hay ninguna razón para que la 'condición' deba conectarse a cualquiera de las 'expresiones' de resultados). Como tal, sería inusual que el compilador fuera diseñado para realizar este análisis contra '?:'. Mientras que, para '??', sabe exactamente que el resultado será la primera expresión sin posibilidad de que esa expresión sea nula, o la segunda expresión. –