昨晚工作到很晚,我们试图弄清楚为什么会出现问题。如果不应该进行验证检查失败。
我们最终在这段代码中添加了一个print语句(从Reflector中反汇编,以便检查代码实际上是我们编写的代码):
public static string Redacted(string name, DateTime lastModified)
{
long ticks = lastModified.Ticks;
if ((ticks != (ticks - (ticks % 10000L))) &&
(lastModified != DateTime.MaxValue))
{
Log.Debug(string.Format("Last Modified Date = '{0}'. Ticks = '{1}'. TicksCalc = '{2}'",
lastModified.ToString("dd/MM/yyyy hh:mm:ss.fff"),
ticks, ticks - (ticks % 10000L)));
它打印(重新格式化):
Last Modified Date = '22/03/2011 12:16:22.000'.
Ticks = '634363497820000000'.
TicksCalc = '634363497820000000'
但条件是“ticks
“(等于上面印刷的Ticks)不等于”(ticks - (ticks % 10000))
“(等于TicksCalc)!634363497820000000!= 634363497820000000?!
为了确定这里发生了什么,我们又添加了两个语句:
long ticks = lastModified.Ticks;
/* Added following two lines: */
long num2 = ticks - (ticks % 10000L);
Log.Debug((ticks == num2).ToString());
/* */
if ((ticks != (ticks - (ticks % 10000L))) &&
(lastModified != DateTime.MaxValue))
{
Log.Debug(string.Format("Last Modified Date = '{0}'. Ticks = '{1}'. TicksCalc = '{2}'",
lastModified.ToString("dd/MM/yyyy hh:mm:ss.fff"),
ticks, ticks - (ticks % 10000L)));
应该有,这个印刷 true
(当用相同的值测试时),并没有写第二行。
感觉有点迷失,我们再次删除了两行,重新编译,并重新。原来的行为重演了。
今天早上, 我录制了一段视频。
首先,视频显示使用“损坏”代码在方法中命中断点,然后使用“工作”代码重建和重新运行。请注意,即使调试器显示了 if
条件评估 false
,身体仍然进入。
我已经看到这样的事情发生在调试器观察之前,因为调试器强制要求评估一些事情,但无论是否使用调试器都会发生这种情况。
此外,这仅在发布模式下发生(即启用了JIT优化)。
以下是两个版本的反汇编方法: 加工, 不工作。我不能真正阅读汇编,所以我将它们发布在这里是为了澄清。
我希望答案不是我完全忽略的明显的答案......!
编辑:这是IL。我认为它没有任何问题,因为它反编译为正确的C#:
更新: