Nullable Typ Problem mit?: Bedingter Operator

Könnte jemand erklären, warum dies in C # .NET 2.0 funktioniert:

Nullable foo; if (true) foo = null; else foo = new DateTime(0); 

… aber das ist nicht:

  Nullable foo; foo = true ? null : new DateTime(0); 

Die letztere Form gibt mir einen Kompiliererrors “Typ des Bedingungsausdrucks kann nicht bestimmt werden, da es keine implizite Konvertierung zwischen ” und ‘System.DateTime’ gibt.”

Nicht, dass ich den ersten nicht verwenden kann, aber der zweite Stil ist konsistenter mit dem Rest meines Codes.

Diese Frage wurde schon einige Male gestellt. Der Compiler teilt Ihnen mit, dass er nicht weiß, wie DateTime in eine DateTime .

Die Lösung ist einfach:

 DateTime? foo; foo = true ? (DateTime?)null : new DateTime(0); 

Beachten Sie, dass Nullable DateTime? geschrieben werden DateTime? was dir eine Menge Tipparbeit erspart.

FYI (Offtopic, aber raffiniert und in Bezug auf Nullable-Typen) haben wir einen handlichen Operator nur für NULL-fähige Typen genannt die Null Koaleszenz-Operator

 ?? 

Verwendet wie folgt:

 // Left hand is the nullable type, righthand is default if the type is null. Nullable foo; DateTime value = foo ?? new DateTime(0); 

Dies liegt daran, dass in einem ternären Operator die beiden Werte in denselben Typ aufgetriggers werden müssen.

Eine andere Lösung, die der akzeptierten entspricht, ist die Verwendung des default C #. Während es mit Generika definiert ist, ist es tatsächlich auf jeden Typ anwendbar.

Beispielverwendung für die Frage des OP:

 Nullable foo; foo = true ? default(DateTime) : new DateTime(0); 

Beispielverwendung mit der aktuell akzeptierten Antwort:

 DateTime? foo; foo = true ? default(DateTime) : new DateTime(0); 

Außerdem müssen Sie bei Verwendung von default die Variable nicht als null angeben, um ihr einen null zuzuweisen. Der Compiler wird den Standardwert des spezifischen Variablentyps automatisch zuweisen und es wird kein Fehler auftreten. Beispiel:

 DateTime foo; foo = true ? default(DateTime) : new DateTime(0); 

Ich weiß, dass diese Frage im Jahr 2008 gestellt wurde und es jetzt 5 Jahre später ist, aber die Antwort, die als Antwort gekennzeichnet ist, befriedigt mich nicht. Die wirkliche Antwort ist, dass DateTime eine Struktur ist und als Struktur nicht mit Null kompatibel ist. Sie haben zwei Möglichkeiten, das zu lösen:

Das erste besteht darin, null mit DateTime kompatibel zu machen (zum Beispiel null auf DateTime zu casting, wie der Gentleman mit 70 upvotes vorschlägt, oder null auf Object oder ValueType zu setzen).

Die zweite Möglichkeit besteht darin, DateTime mit null kompatibel zu machen (zB cast DateTime to DateTime?).