użycie koalescencyjnego operatora zerowego w typach dopuszczalnych do zmiany zmienia typ niejawny

Spodziewałbym się, że następne trzy wiersze kodu będą takie same:

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

We wszystkich przypadkach przydzielamnullableDateTime do nowej zmiennej. Spodziewałbym się, że typ wszystkich zmiennych stanie sięDateTime? ponieważ to jest typnullableDateTime. Ale ku mojemu zaskoczeniu typdateTimeWhatType po prostu staje sięDateTime, więc nie dopuszczaj.

Co gorsza, ReSharper sugeruje zastąpienie drugiej instrukcji nullowym wyrażeniem koalescencyjnym, zamieniając ją w wyrażenie 3. Więc jeśli pozwolę ReSharperowi zrobić to, typ zmiennej zmieni się zDateTime? doDateTime.

W rzeczywistości powiedzmy, że w pozostałej części metody użyłbym

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

To by się dobrze skompilowało, dopóki nie pozwolę ReSharperowi zastąpić drugiego wyrażenia wersją koalescencyjną zerową.

AFAIK, zastępując

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

z

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

powinien rzeczywiście dawać ten sam rezultat. Jednak w przypadku niejawnego wpisywania na typ dopuszczający wartość pustą kompilator wydaje się zagrażać?? tak jakby to znaczyło.

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

Sądzę więc, że moje pytanie brzmi, dlaczego niejawny typ jest zmieniany, gdy używam??, a także gdzie w dokumentacji mogę znaleźć informacje na ten temat.

BTW, to nie jest rzeczywisty scenariusz, ale chciałbym wiedzieć, dlaczego używam?? zmienia typ (niejawny).

questionAnswers(2)

yourAnswerToTheQuestion