ich int
als Beispiel bin mit, aber das gilt für jeden Werttyp in .Net.Net 2+: Warum wird If (1 == null) keine Compiler-Ausnahme mehr werfen?
In .Net 1 der folgenden würde einen Compiler Ausnahme auslösen:
int i = SomeFunctionThatReturnsInt();
if(i == null) //compiler exception here
Now (in .Net 2 oder 3.5) diese Ausnahme ist weg.
Ich weiß, warum das so ist:
int? j = null; //nullable int
if(i == j) //this shouldn't throw an exception
Das Problem ist, dass, weil int?
NULL-Werte zulässt und int
nun eine implizite Umwandlung zu int?
hat. Die obige Syntax ist Compiler Magie. Wirklich wir tun:
Nullable<int> j = null; //nullable int
//compiler is smart enough to do this
if((Nullable<int>) i == j)
//and not this
if(i == (int) j)
So, jetzt, wenn wir i == null
tun wir bekommen:
if((Nullable<int>) i == null)
Da C# Compiler Logik tut dies berechnen sowieso, warum kann es nicht klug genug sein, um zu tun Sie es nicht, wenn Sie mit absoluten Werten wie null
umgehen?
Der Compiler erkennt korrekt, dass es nie wahr ist, als ob Sie 1 == 2 getan hätten. Es ist schlau genug zu wissen, dass int implizit in int umgewandelt werden kann? und das int? kann mit null verglichen werden. Ich vermute, der Optimierer ist schlau genug, um den ganzen Block auszublenden. – Keith