Die Verwendung des Koaleszenz-Null-Operators für nullfähige Typen ändert den impliziten Typ
Ich würde erwarten, dass die nächsten drei Codezeilen gleich sind:
<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>
In allen Fällen weise ich zunullableDateTime
auf die neue Variable. Ich würde erwarten, dass der Typ aller Variablen wirdDateTime?
denn das ist die Art vonnullableDateTime
. Aber zu meiner Überraschung ist die Art vondateTimeWhatType
wird einfachDateTime
, also nicht nullbar.
Um die Sache noch schlimmer zu machen, schlägt ReSharper vor, die zweite Anweisung durch einen Null-Koaleszenz-Ausdruck zu ersetzen und in Ausdruck 3 umzuwandeln. Wenn ich also ReSharper seine Sache machen lasse, ändert sich der Typ der Variablen vonDateTime?
zuDateTime
.
Nehmen wir an, dass ich im Rest der Methode verwenden würde
<code>if (someCondition) dateTimeNullable2 = null; </code>
Das würde sich ganz gut kompilieren lassen, bis ich ReSharper den zweiten Ausdruck durch die Null-Koaleszenz-Version ersetzen lasse.
AFAIK ersetzt
<code>somevar != null ? somevar : somedefault; </code>
mit
<code>somevar ?? somedefault; </code>
sollte in der Tat das gleiche Ergebnis liefern. Bei der impliziten Typisierung eines nullfähigen Typs scheint der Compiler jedoch eine Bedrohung zu sein??
als ob es bedeutet.
<code>somevar != null ? somevar.Value : somedefault; </code>
Ich schätze, meine Frage ist, warum sich der implizite Typ ändert, wenn ich ihn verwende??
, und auch wo in der Dokumentation ich Informationen dazu finden konnte.
Übrigens ist dies kein reales Szenario, aber ich würde gerne wissen, warum??
ändert den (impliziten) Typ.