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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage