2016-09-22 51 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,同样的问题。

相关问题