Есть ли причина, по которой 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. Если вы удалите файл, он будет генерировать случайные имена для ваших переменных.