Есть ли причина, по которой NullReferenceException не дает имя переменной?
ArgumentNullException
имеет свойство ParamName
, чтобы указать, какой аргумент был принят как null.
Почему NullReferenceException
не имеет аналогичного свойства? Было бы технически возможно реализовать внутри .Net?
Ответы
Ответ 1
A NullReferenceException
вызывается CLR, когда он пытается перемещаться по нулевой ссылке. Это не обязательно связано с переменной, и, в частности, CLR действительно не заботится о том, откуда она взялась, - это просто значение в стеке.
Сравните это с ArgumentNullException
, который явно передается через код, например:
if (foo == null)
{
throw new ArgumentNullException("foo");
}
Здесь нет волшебства - и вы можете даже назвать неправильное имя, если хотите. Поэтому они действительно очень разные ситуации.
Ответ 2
ОК, я знаю, что Джон опубликовал хороший ответ, но вот еще информация.
Имя переменной никогда не компилируется в IL. (Я был изначально не уверен, но проверил). Что касается CLR, это просто ссылка, поэтому он не знал бы, какое имя у него есть, и он даже не узнает его тип, поскольку он является нулевым указатель и информация типа извлекаются из указателя типа каждого объекта в куче (получение типа информации для ValueTypes требует их бокса).
Однако Reflector выполняет очень хорошую работу по обратному конструированию ваших скомпилированных сборок и помещает имена переменных обратно, но как IL не имеет понятия имени переменной? Ну, получается, что он может сделать это, используя метаданные, записанные в файл .pdb. Если вы удалите файл, он будет генерировать случайные имена для ваших переменных.