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

Iai*_*ser 14 .net c# spring

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

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

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

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

在此输入图像描述

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

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

Cos*_*ană 7

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

调试x64代码时误报变量值

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

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

试试这个解决方法:

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

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


Leo*_*Leo 1

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