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