typeof(T)可能返回null

在通过TypeBuilder创建的类型上使用typeof运算符时,运算符将返回null。

我很好奇为什么会这样,以及如何防止它。


我开始认为这是即时窗口中的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之后放置断点并在VS立即Windows中键入typeof(MyType) ,则会出现问题。

在通过TypeBuilder创建的类型上使用typeof运算符时,运算符将返回null。

首先,这个说法是正确的。 如果您编写此程序然后在调试器中将其停止并在即时窗口中说“typeof(MyType)”,则返回的结果为“null”。

我很好奇为什么会这样

打败了我。 如果我不得不猜测,我会说表达式评估器可能正在与CLR的调试子系统通信,试图通过其名称获取该类型的元数据标记,并且CLR返回一些垃圾nil标记而不是产生错误。

我不得不强调这是一个猜测; 我实际上没有调试它。

我开始认为这是即时窗口中的VS错误

这似乎很可能。 它应该做的正确的事情是给出错误“类型或名称空间’MyType’在此范围内无效”。 该错误几乎肯定会在C#运行时表达式求值程序中,而不是在即时窗口本身。

感谢您将此问题提请我注意。 我将向表达式评估者维护者提交一个错误,我们将看看他们是否可以解决这个问题。

怎么预防呢?

如果在键入“typeof(MyType)”时疼痛,请停止输入。

如果在变量“o”之后放置断点并在VS Immediate Windows中键入typeof(MyType),则会出现问题。

嗯,是的 MyType没有符号(您使用reflection定义它!),因此您不能在其上使用typeof

编辑:为了澄清,有一次你可以使用typeof并获得运行时创建的类型:当你使用generics时。

 Type MyMethod() 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