2013-06-12 42 views
0

我遇到一些非常奇怪之前,我从来没有见过,不知道如果任何人都可以在这个问题上阐明:IF条件没有得到满足,但代码仍然被触发

的旧代码:

if ((orderFileCreationStatus.OrderFileStatus == OrderFileCreationStatus.Status.ContentCreated 
     || orderFileCreationStatus.OrderFileStatus == OrderFileCreationStatus.Status.NoContent) 
    && orderFileCreationStatus.SpecialMeasureFileStatus != OrderFileCreationStatus.Status.Published 
    && orderFileCreationStatus.PersonalisedProductFileStatus != OrderFileCreationStatus.Status.Published) 
{ 
    webOrderHeader.OrderStatus = Domain.Duos.OrderStatus.AwaitingAuthorisation; 
    webOrderHeader.AuthoriserUserId = null; 
    UpdateWebOrderHeader(webOrderHeader); 

    throw new Exception("Could not create the Order File for order ID: " + webOrderHeader.OrderId.ToString() + "rollback"); 
} 

新代码:

if ((orderFileCreationStatus.OrderFileStatus == OrderFileCreationStatus.Status.ContentCreated || orderFileCreationStatus.OrderFileStatus == OrderFileCreationStatus.Status.NoContent)) 
{ 
    if(orderFileCreationStatus.SpecialMeasureFileStatus != OrderFileCreationStatus.Status.Published) 
    { 
     if(orderFileCreationStatus.PersonalisedProductFileStatus != OrderFileCreationStatus.Status.Published) 
     { 
      webOrderHeader.OrderStatus = Domain.Duos.OrderStatus.AwaitingAuthorisation; 
      webOrderHeader.AuthoriserUserId = null; 
      UpdateWebOrderHeader(webOrderHeader); 

      throw new Exception("Could not create the Order File for order ID: " + webOrderHeader.OrderId.ToString() + "rollback"); 
     } 
    } 
}    

现在,只要这两个if语句是相同的,但这里的渔获ReSharper的关注。

在旧代码中,调试器跳过嵌套在IF中的前三行并抛出异常。

在新代码中,此功能完美无缺。有没有人曾经经历过这件事,更重要的是什么导致了它。我很想知道。

+1

你做清洁/重建项目的/解决方案,以确保调试器代码的最新版本?在调试模式下跳行听起来像使用旧版本。 – Alex

+1

这是一个调试或发布版本?调试器喜欢在可能或不可以在发布版本中运行的行中,部分原因是代码中的提示/映射减少。 – ssube

+1

这始终是错误的:如果 (orderFileCreationStatus.SpecialMeasureFileStatus = orderFileCreationStatus.SpecialMeasureFileStatus!) – JeffRSon

回答

2

这个逻辑永远不会为真:

if(orderFileCreationStatus.SpecialMeasureFileStatus != orderFileCreationStatus.SpecialMeasureFileStatus) 

你的价值型与自己进行比较,这将永远是正确的,然后再否定,真正为false在任何时候。

+1

对不起大卫,因为我在评论中提到我忘了在游戏后回复我的代码。我已经编辑了第二条语句,它是如何读取的。 –

0

这些陈述是相同的。问题必须出现在正在运行的代码版本中。尝试打破。如果块到一个新的控制台应用程序,看看你是否能再次重现的差异:

static void Main(string[] args) 
{ 
    bool A = true; 
    bool B = false; 
    bool C = true; 
    bool D = true; 

    bool result1 = (A || B) && C && D; 
    Console.WriteLine("Old way: " + result1); 

    bool result2 = false; 
    if (A || B) 
    { 
     if (C) 
     { 
      if (D) 
      { 
       result2 = true; 
      } 
     } 
    } 

    Console.WriteLine("New way: " + result2); 

    Console.ReadKey(); 
} 
+0

我们不能在这个环境之外重现它,但是如果我们将代码恢复到原来的状态并再次运行,我们会得到相同的结果。即使有一个干净的构建。 –

+0

您使用的是GAC吗? – Haney

+0

我们不是没有。 我想我们计划在我们有几个截止日期并使用dotpeek的时候使用dotpeek。最终我会公布结果,但我期待它显示相同。 –

相关问题