C# 为什么typeof(Foo)会返回null?
偶尔,我会看到C# 为什么typeof(Foo)会返回null?,c#,.net,C#,.net,偶尔,我会看到typeof(Foo)返回null。为什么会发生这种情况 这是在C#,.NET3.5中 我认为这可能与包含尚未加载类型的程序集有关,但一个测试应用程序显示程序集是在使用typeof的方法开始时加载的 有什么想法吗 更新1 我不能提供一个可复制的样品,因为这发生在一个巨大的应用上 当我说“偶尔”时,我的意思是在我的应用程序中使用相同的方法,但在不同的情况下。此外,当它在运行时失败一次时,该应用程序实例每次都会失败 更新2 该应用程序使用大量内存,并在32位XP上运行。我在想,
typeof(Foo)
返回null。为什么会发生这种情况
这是在C#,.NET3.5中
我认为这可能与包含尚未加载类型的程序集有关,但一个测试应用程序显示程序集是在使用typeof
的方法开始时加载的
有什么想法吗
更新1
- 我不能提供一个可复制的样品,因为这发生在一个巨大的应用上
- 当我说“偶尔”时,我的意思是在我的应用程序中使用相同的方法,但在不同的情况下。此外,当它在运行时失败一次时,该应用程序实例每次都会失败
更新2 该应用程序使用大量内存,并在32位XP上运行。我在想,可能是TypeLoadException或OutOfMemoryException以某种方式被吞没了(但我看不出是如何吞没的,因为我在调试器中打开了第一次机会异常的情况下尝试了这一点)
更新3 刚才遇到了同样的问题。以下是堆栈跟踪: 到目前为止,代码实际上只是:
Type tradeType = typeof(MyTradeType)
TradeFactory.CreateTrade(tradeType)
(之前是.CreateTrade(typeof(MyTradeType))
所以我实际上无法判断typeof
是否返回null)
因此,看起来typeof()
没有返回null,但当它在CreateTrade
方法中结束时,它将设置为null
异常(NullReferenceException
)的HResult
属性为0x80004003
(无效指针
)。调用System.Runtime.InteropServices.Marshal.GetLastWin32Error()
(在即时窗口中)返回127(找不到指定的过程)
。
我在Modules窗口中查看过,包含此类型和方法的模块已经加载,看起来没有任何加载程序错误
由于
typeof(T)
是一个编译时操作符,因此不涉及程序集的加载时间
看到一些代码来演示这一点会很有趣
更有趣的是,有时会发生,有时不会
第一个答案可能是:在实例上使用
GetType()
是否由于某种原因加载dll失败?你查过电话号码了吗
我认为这会导致更多的问题,但如果在使用程序集的任何内容之前进行此检查,则可能会隐藏任何进一步的问题。typeof在编译期间确定类型。因此,即使它返回null,也应该始终返回null。因为该行为在运行时期间不会更改。给一些代码片段一些其他的东西是坏的。这是很有可能的,而且很容易复制。
typeof(T)
如果类型已在内存中创建,则将返回null。
例如,通过
System.Reflection.Emit
。在包的构造函数中使用typeof(MyClass)时,我的VSPackage项目中遇到了这个问题。我将代码移动到重写的Initialize()方法,然后它工作正常,因此看起来程序集尚未加载可能是导致此错误的一个因素。我还要注意,我的VSPackage是在运行时通过MEF加载到visualstudio中的,所以这可能不是您通常的场景,但我仍然认为我应该提到它。很有趣。你能提供一个代码示例来演示这个问题吗?“偶尔”是指偶尔在同一个调用中,还是在某些地方,而不是在其他地方?我个人无法想象这种情况会以任何方式发生。请显示发生这种情况的整个语句。我怀疑您遗漏了一些重要信息。这可能是Eric Lippert及其公司的问题。解析是在编译时进行的,但加载程序在方法开始时加载包含IFoo的模块。但我看不出它如何返回null。我试图复制一个使用大量内存的测试应用程序,因为我认为这是一个正在被吞没的类型加载异常。@Steve我不是说typeof将返回null。但由于类型是在编译时推导出来的,因此在运行时行为应该保持不变。它不能在不同的时间表现不同。据我所知,typeof从未返回null。这是有道理的。但是,任何关于它为什么会为编译类返回null的想法也会有所帮助。