[英]Why would typeof(Foo) ever return null?
偶爾,我看到typeof(Foo)
返回null。 為什么會這樣?
這是在C#,.NET 3.5中。
我認為它可能與包含尚未加載的類型的程序集有關,但是測試應用程序顯示在使用typeof
的方法的開頭加載程序集。
有任何想法嗎?
更新1
更新2
有問題的應用程序使用huuuuuge內存量並在32位XP上運行。 我想也許它是一個TypeLoadException或OutOfMemoryException,它以某種方式被吞下(但我看不出如何,因為我已經嘗試過在調試器中啟用了第一次機會異常)。
更新3
剛才遇到同樣的問題。 這是堆棧跟蹤: 到目前為止的代碼實際上只是:
Type tradeType = typeof(MyTradeType)
TradeFactory.CreateTrade(tradeType)
(之前,它是..CreateTrade(typeof(MyTradeType))
所以我實際上無法判斷typeof
返回null )
因此,看起來typeof()
沒有返回null,但是當它在CreateTrade
方法中結束時它被設置為null 。
異常( NullReferenceException
)的HResult
屬性為0x80004003
( Invalid pointer
)。 對System.Runtime.InteropServices.Marshal.GetLastWin32Error( )
(在立即窗口中)的調用返回127 (The specified procedure could not be found)
。 我查看了模塊窗口,並且已經加載了包含此類型和方法的模塊,並且看起來沒有任何加載器錯誤。
由於某種原因加載dll失敗了嗎? 你檢查了融合日志嗎?
我認為這會導致更多的問題而不僅僅是這個,但是如果你在使用程序集中的任何東西之前進行這項檢查,它可能會隱藏任何進一步的問題。
由於typeof(T)
是編譯時運算符,因此不會涉及程序集的加載時間。
看到一些證明這一點的代碼會很有趣。
更有趣的是,它有時會發生,有時卻不會發生。
第一個答案可能是:在實例上使用GetType()
。
在包的構造函數中使用typeof(MyClass)時,我在VSPackage項目中遇到此問題。 我將我的代碼移動到重寫的Initialize()方法,然后它工作正常,所以看起來組件沒有被加載但可能是這個錯誤的一個因素有時。 我也會注意到我的VSPackage是在運行時通過MEF加載到Visual Studio中的,所以這可能不是你典型的場景,但仍然認為我會提到它。
typeof在編譯期間確定類型。 所以即使它返回null,它也應該總是返回null。 因為在運行時期間行為不會更改。 給一些代碼片段一些其他東西被打破。
這很有可能並且很容易重現。 如果在內存中創建了類型, typeof(T)
將返回null。 以System.Reflection.Emit
為例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.