2016-09-22 77 views
1

在Visual Studio調試器空我有一個很奇怪的問題:投僅在某些計算機

object aObject = LoadObject(); 
MessageBox.show(aObject.GetType().Name) //box shows "Action" 
Action aAction = aObject as Action; 

如果我這樣做,在代碼調試,aAction爲空。 如果我在某處做出斷點並在Visual Studio的直接輸入字段中編寫(aObject as Action).Id我得到正確的值(不爲空)。

如果我從bin/debug文件夾運行exe文件,它可以工作...轉換完成並且aAction不爲空。

這到底是什麼錯誤?

+4

如果你使用調試器,你可以看到底層類型真的是 – Jonesopolis

+1

你使用多線程嗎?因爲這通常是調試與否之間存在這種差異的原因。無論如何,不​​知道LoadObject是什麼,我可以做的不多 - aObject在加載後是否有價值? – gilmishal

+1

什麼是GetType()。FullName?你的Action與返回的對象有什麼不同?調試器表達式評估引擎中存在一些錯誤,這些錯誤在VS2015中再次發生了變化,現在又有其他一些錯誤。你不應該相信100%你在調試器中看到的值。 –

回答

-1

發生這種情況是因爲對象在運行時將其轉換爲某種類型的值,但在此之後,aObject仍然具有類型對象,這就是爲什麼必須強制轉換爲您需要的類型,您還可以使用(Action)aObject來引發異常如果演員不可能。

Object c = "String"; 
Console.WriteLine(c.GetType().Name); // String 
c=new Exception(); 
Console.WriteLine(c.GetType().Name); // Exception 
+0

沒有命名空間問題。爲了測試這個,我使用了類型前面的完整名稱空間。該對象是definitly我想要投的類型。代碼運行,如果我啓動該exe文件。演員陣容只在調試時才起作用。 如果我使用Action aAction = aObject作爲Action; aAction爲空。如果我使用Action aAction =(Action)aObject;該轉換返回一個異常。 再次說明:如果我啓動exe,代碼將起作用,並且如果設置斷點,則演播室將在Visual Studio的直接控制檯中工作。只有在調試代碼中它是空的。 只有在一臺機器上!我們在那裏測試了VS2013和VS2015,同樣的問題。 –

1

我要去無路可退,說您Action是在不同的命名空間。

例如,也許LoadObject返回MyApp.Action,其中您的aObject as Action正在嘗試將其轉換爲System.Action

如果是這樣,最簡單的解決方法是說aObject as MyApp.Action。或者避免首先命名類Action,以避免與System命名空間中的東西衝突。

0

沒有命名空間問題。爲了測試這個,我使用了類型前面的完整名稱空間。

該對象是definitly我想要投的類型。代碼運行,如果我啓動該exe文件。演員陣容只在調試時才起作用。如果我使用 Action aAction = aObject as Action; aaction爲空。 如果我使用 Action aAction =(Action)aObject; 轉換返回一個異常。

再次: 如果我啓動exe,並且在Visual Studio的直接控制檯中工作,如果我設置了斷點,代碼將起作用。只有在調試代碼中它是空的。

而且只在一臺機器上!我們在那裏測試了VS2013和VS2015,同樣的問題。

相關問題