El uso del operador nulo coalescente en tipos anulables cambia el tipo implícito

Espero que las siguientes tres líneas de código sean las mismas:

<code>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;
}
</code>

En todos los casos, asignonullableDateTime a la nueva variable. Yo esperaría que el tipo de todas las variables se convierta enDateTime? ya que ese es el tipo denullableDateTime. Pero para mi sorpresa, el tipo dedateTimeWhatType simplemente se convierteDateTime, por lo que no anulable.

Para empeorar las cosas, ReSharper sugiere reemplazar la segunda declaración con una expresión de unión nula, convirtiéndola en la expresión 3. Entonces, si dejo que ReSharper haga su trabajo, el tipo de variable cambiará deDateTime? aDateTime.

De hecho, digamos que en el resto del método, usaría

<code>if (someCondition) dateTimeNullable2 = null;
</code>

Eso compilaría muy bien, hasta que ReSharper reemplace la segunda expresión con la versión nula coalescente.

AFAIK, sustituyendo

<code>somevar != null ? somevar : somedefault;
</code>

con

<code>somevar ?? somedefault;
</code>

De hecho, debe producir el mismo resultado. Pero para la tipificación implícita en un tipo anulable, el compilador parece amenazar?? como si eso significara.

<code>somevar != null ? somevar.Value : somedefault;
</code>

Así que supongo que mi pregunta es por qué se cambia el tipo implícito cuando uso??, y también donde en la documentación pude encontrar información sobre esto.

Por cierto, este no es un escenario del mundo real, pero me gustaría saber por qué usar?? Cambia el tipo (implícito).

Respuestas a la pregunta(2)

Su respuesta a la pregunta