С MSDN :
Ключевое слово null - это литерал, который
представляет собой нулевую ссылку, которая
не относится ни к какому объекту
Чтобы попытаться сделать его более понятным в старых версиях c #, тип значения не может быть нулевым, т. Е. Он ДОЛЖЕН иметь значение, если вы его не присваивали, вы получили потенциально случайное значение так что-то вроде:
int i;
i++;
console.writeline(i);
в более старых версиях c # объекты должны были быть инициализированы, иначе они были бы нулевыми, что означало, что они не имели ссылки на какой-либо объект.
Теперь с типами значений NULL в c # 2.0+ вы можете иметь значение NULL, что означает, что если у вас есть этот код:
int? i;
i++;
console.writeline(i);
на самом деле вы получите исключение на i ++, потому что я никогда не инициализировался ни для чего, кроме null. Если ноль был 0, этот код работал бы нормально, потому что он просто оценил бы к 0 + 1, однако это неправильное поведение.
Если null всегда был 0, и у вас был обнуляемый int, и вы написали некоторый код вроде:
int? i;
if (int == 0)
{
//do something
}
существует очень реальная возможность того, что вы можете получить неожиданное поведение, если значение null было таким же, как 0, потому что компилятор никак не мог бы различить int, равное null, и int, явно заданное равным 0.
Еще один пример, который проясняет мои мысли:
public int? AddNumbers(int? x, int? y)
{
if (x == null || y == null)
return null;
if (x == 0)
return y;
if (y == 0)
return x;
return x + y;
}
в этом примере ясно, что null и 0 очень разные, потому что если вы передадите 0 для x или y, а null будет равен 0, то приведенный выше код никогда не попадет в проверки для x == 0 или y == 0, однако, если вы запустите код и передадите 0 для x или y, проверки будут выполнены.