Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么typeof(Foo)会返回null?_C#_.net - Fatal编程技术网

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的想法也会有所帮助。