我剛剛遇到了有史以來最令人難以想象的錯誤之一。 false == true您需要什麼信息來確認/調試此行爲?我從來沒有見過這樣的事情。C#How false false == true?見圖
- VS2008 SP1中
- 調試模式|任何CPU
- IIS 7.5
編輯: 我做了一個潔淨>重建還是一樣。
這裏是程序集和寄存器。我不知道如何閱讀,但也許可以幫助別人。
我剛剛遇到了有史以來最令人難以想象的錯誤之一。 false == true您需要什麼信息來確認/調試此行爲?我從來沒有見過這樣的事情。C#How false false == true?見圖
編輯: 我做了一個潔淨>重建還是一樣。
這裏是程序集和寄存器。我不知道如何閱讀,但也許可以幫助別人。
我想你的PDB文件不在同一階段,你在真正執行的內容和Visual Studio看作是行號的地方有不同。嘗試重建。我們都知道,這是不可能有true = false
,或世界,因爲我們知道這可能會改變:-)
也許源不符合運行的版本或有在調試器中的錯誤。
你確定這是拋出的異常嗎?我的直覺是你的方法isContextSignatureValid實際上是拋出一個異常,但是Visual Studio調試器有時可以超前,並突出顯示實際上並沒有拋出異常的那一行。
它確實會拋出錯誤嗎?調試器通常可能會突出顯示錯誤的行,如果您給它提供了錯誤的pdb,那麼這可能是一個錯誤的提示。使用「立即」窗格在測試後更改值也很容易重現。
如果result
是一個字段或捕獲的變量,它也可以由外部代碼(可能在另一個線程)設置。
如果result
不是bool
但自己的自定義類型,你可以只覆蓋==
,或提供自定義true
/false
操作。
你說的沒錯,它不會在下一行拋出異常,所以看起來調試器正在讀取不同的pdb。 –
問題的一部分是,你假設調試器是100%正確的。它實際上不是,並且會受到一些價值可能不正確或誤導性顯示的情況的制約。這種情況最常見的原因是...
但實際上它幾乎肯定不是假的。驗證這一點的最簡單方法是使用調用Debug.WriteLine
將值輸出到輸出窗口。
我想補充一點建議:
如果你有機會從調試器混亂的結果,堅持一個Console.WriteLine()在那裏獲得代碼本身來告訴你是怎麼回事。這通常可以消除混淆。
(調試版本的代碼時,也可以得到這樣的效果,但你說這是一個調試版本,其消除了犯罪嫌疑人)
也許您將鼠標移到當前指令指針(黃色箭頭)不經意間而在休息模式......它發生在我身上一次,我翻了出來。 :-)
我以前見過這樣的事情。一位同事深信他在.Net Framework或CLR中發現了一個錯誤。最後它只是一箇舊的程序集或pdb同步問題。
嘗試使用quickwatch評估結果== true - 我想如果您的調試器顯示結果的值爲false,它將計算爲false。在這一點上,在if語句被評估之後,可能有什麼東西正在改變結果的值?調試器還可以更改結果的值... – Mayo
另外,爲什麼不只是擺脫「'== true」「?我更喜歡:'如果(結果)' – JMD
相關:在VB.net中真實並且真實並非總是如此:http://msmvps.com/blogs/bill/archive/2004/06/23/8730.aspx – recursive