usando coalescing operador nulo em tipos anuláveis ​​muda tipo implícito

Eu esperaria que as próximas três linhas de código fossem as mesmas:

<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>

Em todos os casos, eu atribuonullableDateTime para a nova variável. Eu esperaria que o tipo de todas as variáveis ​​se tornasseDateTime? desde que é o tipo denullableDateTime. Mas para minha surpresa, o tipo dedateTimeWhatType acaba de se tornarDateTime, portanto, não anulável.

Para piorar as coisas, o ReSharper sugere substituir a segunda instrução por uma expressão de coalescência nula, transformando-a em expressão 3. Então, se eu deixar o ReSharper fazer sua parte, o tipo da variável irá mudar deDateTime? paraDateTime.

De fato, digamos que no restante do método eu usaria

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

Isso seria compilado bem, até eu deixar o ReSharper substituir a segunda expressão pela versão de coalescência nula.

AFAIK, substituindo

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

com

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

deve, de fato, produzir o mesmo resultado. Mas para digitação implícita em um tipo anulável, o compilador parece ameaçar?? como se isso significasse.

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

Então, eu acho que minha pergunta é por que o tipo implícito é alterado quando eu uso??, e também onde na documentação eu poderia encontrar informações sobre isso.

BTW, este não é um cenário do mundo real, mas eu gostaria de saber por que usar?? altera o tipo (implícito).

questionAnswers(2)

yourAnswerToTheQuestion