Warum versucht der Versuch, einen NULL-Wert hinzuzufügen, eine InvalidOperationException auszulösen?

8
%Vor%

Ich würde erwarten, dass der Compiler versucht, x als int zu interpretieren, aber anscheinend nicht.

Bearbeiten nach 280Z28: NullReferenceException wurde in InvalidOperationException geändert, was Nullable<T>.Value löst aus, wenn HasValue falsch ist.

    
newdayrising 28.01.2010, 16:47
quelle

7 Antworten

10

Dies entspricht der Spezifikation für aufgehobene binäre Operatoren. Aus §7.2.7:

  

Für die binären Operatoren

     

+ - * / % & | ^ << >>

     

Eine aufgehobene Form eines Operators existiert, wenn der Operand und die Ergebnistypen alle nicht nullbaren Werttypen sind. Die aufgehobene Form wird konstruiert, indem jedem Operanden und Ergebnistyp ein einzelner ? -Modifikator hinzugefügt wird. Der aufgehobene Operator erzeugt einen Nullwert, wenn einer oder beide Operanden null sind (eine Ausnahme sind die Operatoren & amp; und | des bool? -Typs, wie in §7.10.3 beschrieben). Andernfalls entpackt der gehobene Operator die Operanden, wendet den zugrunde liegenden Operator an und umschließt das Ergebnis.

Der Grund dafür ist folgender: Sie müssen an null für einen Nullwert-Typ denken, der bedeutet "Ich weiß nicht, was der Wert ist". Was ist das Ergebnis von "Ich weiß nicht" plus eins? "Ich weiß es nicht." Daher sollte das Ergebnis null sein.

    
jason 28.01.2010, 17:00
quelle
5

Nullables sind niemals Null-Referenzen. Sie sind immer Objektreferenzen. Ihre internen Klassen überschreiben die Operatoren == und = . Wenn sie mit null verglichen werden, geben sie den Wert der Eigenschaft HasValue zurück.

    
rusty 28.01.2010 16:51
quelle
2

Warum sollten Sie erwarten, dass der Compiler es als int darstellt, wenn Sie es als Nullable deklariert haben? Der Compiler tut, was Sie ihm gesagt haben, und null +1 = null.

Sie müssen explizit casten oder x.HasValue überprüfen, bevor Sie versuchen, einen int. hinzuzufügen.

    
Mark Green 28.01.2010 16:51
quelle
2

Der Grund dafür ist, dass der Compiler einen 'aufgehobenen' Operator für Nullable-Typen erstellt - in diesem Fall ist es etwa so:

%Vor%

Ich denke, wenn Sie versuchen, das Ergebnis einem nicht nullbaren Wert zuzuweisen, wird der Compiler gezwungen, die nicht nullbare Überladung zu verwenden und x zu einem int zu konvertieren.

%Vor%     
Lee 28.01.2010 16:59
quelle
0

Leider nicht. Das X in x = X + 1 ist null wie in der ersten Zeile, also addieren Sie 1 zu null, was gleich null ist.

Da es ein nullwertfähiges int ist, können Sie x.HasValue verwenden, um zu überprüfen, ob es einen Wert hat, und dann x.Value, um den tatsächlichen int-Wert herauszulösen

    
Paul 28.01.2010 16:49
quelle
0

Unabhängig davon, ob x tatsächlich nie null ist, das ist nicht einmal der Punkt.

Der Punkt ist, wann haben Sie jemals eine NullReferenceException gesehen, wenn Sie versuchen, eine Addition durchzuführen?

Das folgende Beispiel wirft auch keine NullReferenceException und ist absolut gültig.

%Vor%

Sie würden nur NullReferenceException erhalten, wenn Sie versuchen, auf ein Mitglied eines Objekts zuzugreifen, das null ist.

    
Wim Hollebrandse 28.01.2010 17:13
quelle
-1

int? kann niemals null sein, weil es eine Struktur ist. Strukte leben auf dem Stapel und der Stapel behandelt NULL nicht gut.

Siehe Was ist eine NullPointerException und wie behebe ich sie?

Außerdem haben die Nullable-Typen 2 sehr nützliche Eigenschaften: HasValue, Value

Dieser Code:

%Vor%

Sollte umgestaltet werden:

%Vor%     
fremis 28.01.2010 21:00
quelle

Tags und Links