typeof(T) может вернуть ноль
При использовании typeof
оператор для типа, созданного через TypeBuilder, оператор возвратит ноль.
Мне любопытно, почему это происходит и как это предотвратить.
Я начинаю думать, что это ошибка VS в ближайшем окне, но я не совсем уверен. Сначала очень легко обвинять других.
Хорошо... код для воспроизведения вопроса:
static void Main()
{
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName("MyAssembly"),
AssemblyBuilderAccess.RunAndSave);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule");
TypeBuilder typeBuilder = moduleBuilder.DefineType("MyType", TypeAttributes.Public, typeof(ArrayList));
ArrayList o = (ArrayList)Activator.CreateInstance(typeBuilder.CreateType());
Console.WriteLine(o.GetType().Name);
}
Если вы ставите точку останова после переменной o
и введите typeof(MyType)
в VS Immediate Windows вы получите проблему.
2 ответа
При использовании оператора typeof для типа, созданного с помощью TypeBuilder, оператор возвращает ноль.
Прежде всего, претензия верна. Если вы напишите эту программу, а затем остановите ее в отладчике и скажете "typeof(MyType)" в ближайшем окне, результат, который возвращается, будет "нулевым".
Мне любопытно, почему это происходит
Черт побери из меня. Если бы мне пришлось угадывать, я бы сказал, что, возможно, оценщик выражений обменивается данными с подсистемой отладки CLR, чтобы попытаться получить токен метаданных для типа по его имени, и CLR возвращает некоторый мусорный ноль-токен вместо того, чтобы выдавать ошибку,
Спешу подчеркнуть, что это предположение; Я на самом деле не отлаживал это.
Я начинаю думать, что это ошибка VS в ближайшем окне
Это кажется вероятным. Правильно, что он должен делать, это выдавать ошибку "тип или пространство имен" MyType "недопустимо в этой области". Ошибка почти наверняка будет в оценщике выражений среды выполнения C#, а не в самом непосредственном окне.
Спасибо за то, что обратили мое внимание на проблему. Я сообщу об ошибке сопровождающим оценщика выражений, и мы посмотрим, смогут ли они решить эту проблему.
как это предотвратить?
Если больно, когда вы набираете "typeof(MyType)", прекратите вводить это.
Если вы поставите точку останова после переменной 'o' и введите typeof(MyType) в Windows Immediate VS, вы получите проблему.
Ну, да. MyType
не имеет символа (вы определяете его с помощью отражения!), поэтому вы не можете использовать typeof
в теме.
Редактировать: для пояснения, есть ровно один раз, когда вы можете использовать typeof
и получите тип, созданный во время выполнения: когда вы используете дженерики.
Type MyMethod<T>() where T : class {
return typeof(T);
}
Type myType = //create type dynamically;
Type myOtherType = //invoke MyMethod with myType as the type parameter
Debug.Assert(myType == myOtherType); //will not fire