Verwendung der bedingten Operation mit Nullable Int

8

Ein kleines Problem. Irgendeine Idee Leute, warum das nicht funktioniert?

%Vor%

Ich versuche null zurückzugeben, wenn der linke Ausdruck True ist, sonst 1 . Scheint einfach, aber gibt einen Kompilierungsfehler.

Der Typ des Bedingungsausdrucks kann nicht bestimmt werden, da es keine implizite Konvertierung zwischen null und int gibt.

Wenn ich das null in ? null : 1 durch irgendein gültiges int ersetze, dann gibt es kein Problem.

    
Rajarshi 21.05.2010, 10:45
quelle

5 Antworten

20

Ja - der Compiler kann keinen passenden Typ für den bedingten Ausdruck finden. Ignoriere die Tatsache, dass du es einem int? zuordnest - der Compiler benutzt diese Information nicht. Also der Ausdruck ist:

%Vor%

Was ist der Typ dieses Ausdrucks? Die Sprachspezifikation besagt, dass es entweder der Typ des zweiten Operanden oder der des dritten Operanden sein muss. null hat keinen Typ, also müsste es int (der Typ des dritten Operanden) sein - aber es gibt keine Konvertierung von null nach int , also scheitert es.

Wirf einen der Operanden auf int? und es wird funktionieren, oder benutze einen anderen Weg, um den Nullwert auszugeben - also irgendwas davon:

%Vor%

Ich stimme zu, es ist ein leichter Schmerz, dass Sie das tun müssen.

Aus dem C # 3.0-Sprachspezifikationsabschnitt 7.13:

  

Der zweite und dritte Operand des   ?: operator steuert den Typ des   bedingter Ausdruck. Lass X und Y sein   die Arten der zweiten und dritten   Operanden. Dann,

     
  • Wenn X und Y vom selben Typ sind, dann ist dies der Typ der Bedingung   Ausdruck.

  •   
  • Andernfalls, wenn eine implizite Konvertierung (§ 6.1) von X nach Y existiert, aber nicht   von Y bis X, dann ist Y der Typ der   bedingter Ausdruck.

  •   
  • Andernfalls, wenn eine implizite Konvertierung (§ 6.1) von Y nach X existiert, aber nicht   von X nach Y, dann ist X die Art der   bedingter Ausdruck.

  •   
  • Andernfalls kann kein Ausdruckstyp und ein Fehler bei der Kompilierung festgestellt werden   tritt auf.

  •   
    
Jon Skeet 21.05.2010, 10:50
quelle
4

versuche das:

%Vor%     
Klaus Byskov Pedersen 21.05.2010 10:47
quelle
2

Vielleicht könnten Sie es versuchen:

%Vor%

anstelle von null

    
KroaX 21.05.2010 10:48
quelle
1

int? i = (wahr? neu int? (): 1);

    
Marcel 21.05.2010 10:51
quelle
1

Das funktioniert: int? nullableIntVal = (this.Policy == null) ? null : (int?)1; .

Grund (vom Kommentar kopiert):

Die Fehlermeldung besteht darin, dass die beiden Zweige des ?: -Operators ( null und 1 ) keinen kompatiblen Typ haben. Die Zweige der neuen Lösung (mit null und (int?)1 ) tun dies.

    
Stephen Cleary 21.05.2010 10:47
quelle