2013-06-12 82 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。最終我會公佈結果,但我期待它顯示相同。 –

相關問題