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
Другие вопросы по тегам