Я использую int
в качестве примера, но это относится к любому типу значения в .Net
В .Net 1 следующее вызовет исключение компилятора:
int i = SomeFunctionThatReturnsInt();
if( i == null ) //compiler exception here
Теперь (в .Net 2 или 3.5) это исключение исчезло.
Я знаю, почему это:
int? j = null; //nullable int
if( i == j ) //this shouldn't throw an exception
Проблема в том, что int?
имеет значение NULL и int
теперь имеет неявное приведение к int?
. Синтаксис выше - магия компилятора. На самом деле мы делаем:
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)
Итак, теперь, когда мы делаем i == null
, мы получаем:
if( (Nullable<int>) i == null )
Учитывая, что C # в любом случае выполняет логику компилятора, чтобы вычислить это, почему он не может быть достаточно умным, чтобы не делать этого при работе с абсолютными значениями, такими как null
?