“is”表达式的结果在运行时返回false,但在检查时为true

时间:2014-01-14 03:13:15

标签: c# .net spring

我有以下代码。 CustomControlHelper通过反射生成对象的实例。在这个阶段,我们不知道我们正在处理什么类型的对象。我们知道它将是CustomControl,但我们不知道它是否实现了任何特定的接口,或者它是否扩展了任何其他类。以下代码尝试确定加载的控件是否实现IRichAdminCustomControl接口。

Object obj = CustomControlHelper.GetControl(cc.Id, cc.ControlClass);            
if(obj != null)
{
    bool isWhatWeWant = (obj is IRichAdminCustomControl);
    return isWhatWeWant;
}

这一切都很好,但我注意到当我知道我有一个实现IRichAdminCustomControl的对象时,表达式的计算结果为false。

好的,这就是它变得非常奇怪的地方。如果我在调试时检查代码,表达式的计算结果为true,但是如果我立即让代码运行并检查结果,则计算结果为false(我在下面附上了一个动画gif来说明)。

enter image description here

之前有没有人遇到这样的奇怪现象,如果是的话,究竟是什么导致了它呢?

顺便说一句,我相信我使用的产品使用Spring.NET在CustomControlHelper中提供依赖注入。

4 个答案:

答案 0 :(得分:7)

如果您使用的是Visual Studio 2010 SP1,我遇到了这个错误:

Misreporting of variable values when debugging x64 code

该页面上有一个解决方法,由Microsoft发布:

  

您可以将所有项目设置为编译为x86,也可以创建一个中间初始化变量声明,以确保调试器报告正在检查的变量的正确值。

尝试将其作为解决方法:

bool isWhatWeWant = true;
isWhatWeWant &= (obj is IRichAdminCustomControl);
bool finalValue = isWhatWeWant; // this line should fix isWhatWeWant too in the debugger
return finalValue;

编辑:似乎VS2012在特定条件下也会遇到类似的问题。

答案 1 :(得分:1)

这件事发生在我身上,即使我从未得出结论为什么会发生这种情况我相信PDB文件正在加载调试符号,这些文件不同步。因此,通过“清理”解决方案,然后重建解决方案,这个奇怪的问题就消失了。

答案 2 :(得分:1)

有两种可能性浮现在脑海中。第一个是你的接口名称足够通用,它可能已经在某个名称空间中。尝试完全限定is子句中的接口。第二种可能性是您可能将代码作为构造函数的一部分运行,或者由构造函数间接调用。在我们确定应用程序已完全加载后,需要完成任何类似的反射。

答案 3 :(得分:1)

所以我找到了答案。这是因为我在不同的位置有两个dll副本。我在后端应用程序的bin中有一个副本,在后端应用程序动态加载的共享外部目录中有一个副本。

我应该解释一下;此应用程序包含两个串联运行的应用程序,一个前端应用程序和一个后端应用程序。通常,您将“自定义控件”放入您的前端应用程序。然后将这些控件在应用程序启动时复制到后端应用程序可访问的外部目录。

在这种情况下,我的自定义控件库中有逻辑需要在后端应用程序中访问 - 所以我不得不引用它...最后,后端应用程序有两个相同的引用类。 D'哦!当你正在调试时,它会发挥作用。

解决方案是将我的额外逻辑拆分为自己的项目,并在后端应用程序中引用它。

我不会在这里“接受”我自己的答案,因为虽然它解决了我的具体问题,但解决方案对我正在使用的应用程序来说有点过于特殊,并且不太可能帮助其他任何人。< / p>