【问题标题】:C# How can false == true ? See PictureC# 怎么能 false == true ?见图片
【发布时间】:2010-01-19 22:31:22
【问题描述】:

我刚刚遇到了有史以来最令人难以置信的错误之一。 false == true 你们需要什么信息来确认/调试这种行为?我从来没有见过这样的东西。

  • VS2008 sp1
  • 调试模式 |任何 CPU
  • IIS 7.5

编辑: 我做了一个干净的->重建,还是一样。

这是程序集和寄存器。我不知道如何阅读,但也许它可以帮助其他人。

【问题讨论】:

  • 尝试使用 quickwatch 来评估 result == true - 如果您的调试器显示 result 的值为 false,我想它会评估为 false。在这一点上,在 if 语句被评估之后,也许有什么东西正在改变 result 的值?调试器也可以改变结果的值...
  • 另外,为什么不干脆去掉“== true”呢?我更喜欢:if (result)
  • 相关:在 VB.net 中 true 并且 true 并不总是正确的:msmvps.com/blogs/bill/archive/2004/06/23/8730.aspx
  • 在军事时期这真的可能发生
  • 唉,它不是 C++。否则我会争辩说最近被解雇的同事有时间将#define true false //happy debugging, ... 放入代码库中。

标签: c# .net visual-studio debugging


【解决方案1】:

我想您的 PDB 文件不是同相的,并且您在实际执行的内容和 Visual Studio 视为行号的内容方面存在差异。尝试重建。我们都知道不可能拥有true = false,否则我们所知道的世界可能会改变:-)

【讨论】:

  • 回到 VB6 我实际上有true = false。在同一个调试会话中,所有错误处理都失败了,执行通过了每个if 语句的每个可能的分支,天黑了,天使从天而降……那天不得不重新安装VB 3次;从来没有弄清楚是什么原因造成的......啊,美好的过去......
  • « 或者我们所知道的世界可能会改变 » → 也许有人发现了这个问题?! :o
  • @Rory - 还记得 C++ 方面的 VARIANT_BOOL 有多么有趣吗?
【解决方案2】:

它真的会抛出错误吗?如果您输入错误的 pdb,调试器通常会突出显示错误的行,因此这可能是错误的线索。在测试后使用“立即”窗格更改值也很简单。

如果result 是一个字段或捕获的变量,它也可以由外部代码设置(可能在另一个线程上)。

如果result 不是bool 而是您自己的自定义类型,您可以直接覆盖==,或提供自定义true/false 运算符。

【讨论】:

  • 你是对的,它不会在下一行抛出异常。所以看起来调试器正在读取不同的 pdb。
【解决方案3】:

可能源与运行的版本不对应,或者调试器中存在错误。

【讨论】:

    【解决方案4】:

    部分问题在于您假设调试器是 100% 正确的。事实上,它不是并且受制于值可能具有不正确或误导性显示的许多情况。最常见的原因是...

    • 不匹配的 PDB 文件。这通常会导致调试器中至少出现一个关于源文件不匹配的警告对话框,但并非总是如此
    • 基础表达式求值程序的简单数据检查或显示错误。在这种情况下不太可能,因为它是一个简单的本地和原始类型。
    • 导致数据显示不正确的优化。

    但事实上它几乎肯定不是假的。验证这一点的最简单方法是使用Debug.WriteLine 调用将值打印到输出窗口。

    【讨论】:

      【解决方案5】:

      你确定这是抛出的异常吗?我的预感是您的方法 isContextSignatureValid 实际上是在抛出异常,但 Visual Studio 调试器有时会超前并突出显示实际上并未抛出异常的行。

      【讨论】:

        【解决方案6】:

        也许你在中断模式下不小心用鼠标移动了当前指令指针(黄色箭头)......这发生在我身上一次,我突然崩溃了。 :-)

        【讨论】:

          【解决方案7】:

          只是补充一点建议:

          如果您从调试器中得到令人困惑的结果,请在其中粘贴一个 Console.WriteLine() 并获取代码本身来告诉您发生了什么。这通常可以消除混乱。

          (你也可以在调试发布代码时得到这样的效果,但你说这是一个调试版本,可以消除这个嫌疑)

          【讨论】:

            【解决方案8】:

            我以前见过这种事情。一位同事确信他发现了 .Net Framework 或 CLR 中的错​​误。最后这只是一个旧的程序集或 pdb 同步问题。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-05-16
              • 2021-06-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-05-02
              • 2012-02-27
              相关资源
              最近更新 更多