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