Warum lässt der bedingte Operator die Verwendung von "null" für die Zuweisung zu Nullwerttypen nicht zu? [Duplikat]

8
  

Mögliche Duplikate:
Nullable-Typen und der ternäre Operator. Warum funktioniert das nicht?
Bedingte Operatorzuweisung mit nullable & lt; Wert & gt; Typen?

Dies wird nicht kompiliert und besagt "Typ des bedingten Ausdrucks kann nicht bestimmt werden, da es keine implizite Konvertierung zwischen 'System.DateTime' und ''"

gibt %Vor%

Das funktioniert gut

%Vor%     
Daniel Coffman 15.03.2010, 22:18
quelle

6 Antworten

8

Dies funktioniert nicht, weil der Compiler keine implizite Konvertierung auf beiden Seiten gleichzeitig einfügt, und null erfordert eine implizite Konvertierung, um ein Nullable-Typ zu werden.

Stattdessen können Sie

schreiben %Vor%

Dies erfordert nur eine implizite Konvertierung ( DateTime bis DateTime? ).

Alternativ können Sie auch die linke Seite verwenden:

%Vor%

Dies erfordert auch nur eine implizite Konvertierung.

    
SLaks 15.03.2010, 22:22
quelle
4

Der bedingte Operator betrachtet nicht, in was der Wert zurückgegeben wird. Es werden nur die Werte betrachtet, zwischen denen es ausgewählt werden soll: eine DateTime und eine Null. Es kann diese nicht als Instanzen des gleichen Typs identifizieren (da null keine gültige DateTime ist), daher der Fehler. Sie und ich wissen, dass Nullable<DateTime> den Job erledigen kann, aber der bedingte Operator darf keine "größeren" Typen einführen: Es ist nur erlaubt, die Typen der beiden Ausdrücke zu betrachten, zwischen denen er wählt. (Danke an Aaronaught in Kommentaren zur Klarstellung dieses Punktes und ein schönes klärendes Beispiel.)

Um dies zu umgehen, geben Sie dem Operator einen Hinweis, indem Sie DateTime:

übergeben %Vor%     
itowlson 15.03.2010 22:23
quelle
1

Dies ist ein Duplikat von

NULL-Typen und das ternäre Operator: Warum ist '? 10: null 'verboten?

Meine Antwort auf

Bedingter Operator kann nicht implizit umwandeln?

gibt eine Analyse, die für diese Frage relevant ist.

Ich werde auch im April über ein ähnliches Problem mit dem bedingten Operator bloggen; Sehen Sie sich den Blog für Details an.

    
Eric Lippert 16.03.2010 05:54
quelle
0

Der Grund dafür ist, dass null vom Typ object ist, also müssen Sie es wie folgt in den richtigen Typ umwandeln:

%Vor%     
Keltex 15.03.2010 22:24
quelle
0

Die korrekteste Methode (IMO) besteht darin, dies zu tun

%Vor%

Ich benutze den Null-Kollationierungsoperator häufig auf diese Weise.

    
Chris Marisic 15.03.2010 22:24
quelle
0

Dies ist wahrscheinlich der Fehler, den Sie in dieser Situation bekommen:

  

Fehler CS0173: Art der Bedingung   Ausdruck kann nicht bestimmt werden   weil es kein implizites gibt   Umwandlung zwischen '' und 'int')

Der Compiler erklärt, dass er nicht weiß, wie null in ein DateTime konvertiert.

Fix:

Sie müssen cast explicitly die expression angeben, die null an den Typ nullable zurückgeben. Das wird funktionieren

%Vor%     
Asad Butt 15.03.2010 22:25
quelle