VS2015调试器显示错误的值?

6

编辑:在Visual Studio 2013中运行此代码时,调试器显示的是Utc而不是Local。 这是Visual Studio 2015 Debugger中的一个错误。

编辑:我已经将代码放在独立的控制台应用程序中,但无法在任何版本的VS中重现。非常遗憾。

有人能向我解释一下这个屏幕截图中看到的东西怎么可能?!

  1. 在第298行,endingTimePeriodStartDate被重新定义为其Date值,但被设置为DateTimeKind.Utc
  2. 在第300行,如果endingTimePeriodStartDate实际上不是DateTimeKind.Utc,则会抛出异常。
  3. 在第305行中断点被触发,这意味着第302行上的异常没有被抛出,也就是说endingTimePeriodStartDate.Kind == DateTimeKind.Utc
  4. (我还在第305行之前做了一个System.Diagnostic.Debug.WriteLine(endingTimePeriodStartDate.Kind),它在输出窗口中打印“Utc”)。
  5. 当我查看调试器窗口中的Locals和Watch以及悬停在变量上时,Kind属性显示的是DateTimeKind.Local

enter image description here


4
你能否用一个简短但完整的应用程序来复现这个问题,以便我们都可以亲自尝试一下? - Jon Skeet
3
由于您返回了一个Task,我猜测您在使用async编程。在第300行和305行之间的这个小间隙内,是否有可能另一个线程更改了endingTimePeriodStartDate - Christoph Fink
你能重现一下吗?可能是一个很糟糕的软件错误。 - Bgl86
顺便提一下:您正在使用VS 2015和C# 6 ->为什么不在Ln 295中使用new ArgumentNullException(nameof(date))来消除“魔术字符串”? - Christoph Fink
1
问题不在于你是否使用了异步,而在于是否存在任何并行操作。如果函数仍然返回一个“Task”,那么这仍然可能归因于多线程问题。 - Asad Saeeduddin
显示剩余6条评论
1个回答

2
通常情况下,调试器会显示错误的行号,并进入旧代码,如果它运行的是与您的代码显示不同版本的dll(以前的版本)。这种情况发生在以下情况下:
  • 存在某种缓存
  • 以前运行的版本没有正确关闭,或仍在另一个进程中运行。
  • Visual Studio没有指向正确的代码
通常,要解决此问题,您应该:

(首先尝试“清理”和“重建”)

  1. 停止所有正在运行或调试的Visual Studio项目。
  2. 关闭所有Visual Studio解决方案和窗口,以便Visual Studio未运行。
  3. (如果下一步无法解决问题,则下次进行下一步之前也重新启动计算机)
  4. 只重新打开您需要运行的解决方案。点击“清理解决方案”。然后点击“重建解决方案”。

检查是否已解决问题。

  1. 手动删除bin文件夹:(如果清理/重建未起作用)

5.1 如果您担心,请备份整个源目录。在一切正常之后,删除备份...

5.2 手动进入被引用在您的“错误代码显示”项目中的依赖项目,并在每个项目中进入obj和bin文件夹,删除从那里自动创建的所有内容-换句话说,您没有手动放置的所有内容。通常是所有东西。不要担心,Visual Studio将重新创建Debug和Release目录并填充它们。

也删除您的项目的obj和bin。

重新构建一切。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接