Visual Studio: 詭異的即時監看結果
同事反應給我的問題,程式裡有段寫法if (r["F"] == "Y")的判別結果很怪,Line by Line Debug時,r["F"]的內容是"Y"沒錯,用Command Window檢查或監看(r["F"] == "Y")的結果是true,但實際的流程卻跑到false的分支。
首先要聲明,r["F"] == "Y"的寫法是有問題的。Visual Studio.NET 2003會提出警告,指出不應該將object與string直接相比。但是有趣的地方在於,實際流程中的二者比對結果是不相等,但即時運算視窗檢測卻二者相等。
我本來怪罪這是VS.NET 2003的老Bug,於是寫了一小段程式做實驗,卻發現更好玩的狀況。下圖是在VS.NET 2003的測試結果,我使用Watch監看r["F"]=="Y"跟在程式中比對(r["Y"]=="Y")後存入Boolean的變數b,二者的結果都是true。與我同事程式中為false,監看為true的狀況不同。

同樣的程式搬到VS2008(後來再測試VS2005的結果與VS2008相同),結果大異其趣。監看r["F"]=="Y"為false, 程式中的比對結果則為true,跟同事程式中的結果剛好相反。
感覺上是Visual Studio在除錯模式下判定比對結果的邏輯與實際Runtime不同所致,但VS2003, VS2005, VS2008, 實際程式與測試Code的結果理不出頭緒。
我把用VS2008 Submit a Bug功能把這問題反應給MS,當天得到回覆說已將問題轉交RD研究。如果有進一步消息,再報給大家知。