Почему typeof (HttpResponseMessage) имеет значение null?

У нас есть собственный инструмент для создания документации по нашему веб-API. Он читает /// комментарии и создает на их основе документацию. Но у нас есть одна странная проблема: выражение typeof(HttpResponseMessage) странным образом оценивается как null. Почему так происходит?

Чтобы уточнить: когда мы читаем сборки во время выполнения и создаем документацию, у нас есть HttpResponseMessage в MethodInfo.ReturnType некоторых методов API. Этот работает без проблем. Но когда мы пытаемся проверить, является ли тип HttpResponseMessage, мы делаем if(methodInfo.ReturnType == typeof(HttpResponseMessage), и здесь правая часть этого, если всегда оценивается как null. Когда я запускаю его в отладчике Visual Studio и пишу typeof(HttpResponseMessage) в окно Watch, он тоже оценивается как null.

(Тип определен в System.Net.Http.)

Вот снимок экрана отладчика, показывающий, что это реально:  введите описание изображения здесь

На снимке ясно видно, что typeof возвращает null как в программе, так и в окне Watch, но переменная parameterType фактически указывает на объект типа этого класса. Это обычное консольное приложение Win32.


person Al Kepp    schedule 18.07.2018    source источник
comment
Предоставьте минимальный воспроизводимый пример. Я был бы очень удивлен, если бы typeof(HttpResponseMessage) действительно возвращал null. Вполне возможно, что здесь возникают проблемы с отладчиком - было бы лучше, если бы ваш пример присвоил значение переменной и сравнил его с null.   -  person Jon Skeet    schedule 18.07.2018
comment
typeof(HttpResponseMessage) возвращение null, к сожалению, труднее поверить, чем ошибка пользователя. Я хотел бы увидеть минимальный воспроизводимый пример, демонстрирующий эту проблему. AFAIK, typeof(x) может возвращать только null, если рассматриваемый класс является динамическим классом, созданным в памяти. Здесь дело обстоит не так.   -  person    schedule 18.07.2018
comment
Я добавил скриншот из отладчика VS.   -  person Al Kepp    schedule 18.07.2018
comment
@Amy: Я не уверен, применима ли ваша ссылка к этому случаю, потому что это не общий и не динамически генерируемый тип. Или я не прав?   -  person Al Kepp    schedule 18.07.2018
comment
@AlKepp Вывод: typeof работает только для типов, существующих во время компиляции. Типы, созданные во время выполнения, не применяются. Я знаю, что это не относится к вашему случаю, я уже сказал об этом в своем первом комментарии.   -  person    schedule 18.07.2018
comment
Как ты сборки читаешь? Вы делаете что-то странное, например, загружаете что-нибудь с ReflectionOnly?   -  person Damien_The_Unbeliever    schedule 18.07.2018
comment
Будут ли другие типы из той же сборки вести себя аналогичным образом, например, typeof(System.Net.Http.HttpContent) также будет выглядеть как null? У вас есть несколько версий этой сборки? Вам все равно нужно предоставить нам полностью воспроизводимый образец. С этого tio.run кода, все кажется нормальным .   -  person Jeppe Stig Nielsen    schedule 18.07.2018
comment
Опять же, снимок экрана отладчика не так полезен, как минимальный воспроизводимый пример. В окне Watch может происходить много, которое не ведет себя так же в других местах, и если мы не можем воспроизвести это, нам будет намного сложнее помочь.   -  person Jon Skeet    schedule 18.07.2018


Ответы (1)


Похоже, я попал в странный крайний случай. Оператор typeof возвращает null для типов, импортированных из сборки System.Net.Http, на которую ссылается проект, но файл находится в C: \ Program Files \ Reference Assemblies, который, как мне кажется, не используется для поиска сборок во время выполнения. И ссылка установлена ​​как CopyLocal = false. Похоже, проблема вызвана тем, что тип доступен во время компиляции, но не во время выполнения. Я бы ожидал исключения, если тип отсутствует и не может быть загружен во время выполнения, но вау, этот оператор просто незаметно выдает значения NULL.

Я проверю завтра, смогу ли я исправить проблему, исправив эту плохую ссылку.

person Al Kepp    schedule 18.07.2018