Dot-Net

QuickWatch 無法正常顯示 Nullable 屬性的“.ToString()”

  • May 18, 2017

我在 vb.net 中有一個可為空的整數屬性。

程式碼中的這個屬性具有正確的值,但在QuickWatch總是顯示1中,除非我用一個值初始化它然後顯示六個洋地黃數字。

我的程式碼是:

Public Property MyNumber As Integer?

MyNumber = 6546

MessageBox.Show(MyNumber.ToString())

快看1

並且對於始終顯示的可為空的雙重屬性QuickWatch``4/94065645841247E-324

快看2

我對此進行測試.Net 4 & 4.5visual studio 2010 & 2013得到相同的結果。但是C#沒有這個問題

編輯:

我也附加了我的項目結果,正如您在監視視窗中看到的那樣,它們都顯示了 快看3

為什麼會這樣?

編輯:

這個問題與 .Net 4 和 4.5 和 4.5.1 有關。用.Net 2.0 和 3.5 沒問題

確認,這確實是調試器中的一個錯誤。我搜尋了 connect.microsoft.com 並沒有找到類似的東西,這不是一個困擾許多 VB.NET 程序員的錯誤。並不完全令人驚訝,這只會在您將 .ToString() 附加到可為空的變數名稱時出錯。從來沒有人這樣做過。

這不是您可以在此站點上獲得任何幫助的錯誤,這是 Microsoft 需要修復的錯誤。

稍微描述一下這個錯誤,這在調試器中內置的 VB.NET 特定表達式解析器中似乎出錯了。您無法在 C# 項目中重現此內容的原因。以及為什麼程序的位數無關緊要,64 位調試器也顯示錯誤的值。這通常是微軟一直在努力退休的一段變化無常的程式碼。基本問題是他們必須在調試器中建構等效的 VB.NET 編譯器,以便解析這些表達式。雖然有限,但該解析器幾乎不支持整個語言。副作用是調試器執行的程式碼可能與您的程序執行的程式碼不同。

Nullable(Of T).ToString() 的程式碼生成相當棘手,它需要條件裝箱轉換。解析器會為任何此類表達式弄錯它,請注意如何MyNumber.GetHashCode()產生錯誤的值。和MyNumber.Equals(5456.0)。需要裝箱轉換的表達式。

從技術上講,您也可以在 connect.microsoft.com 上報告此錯誤,但我不建議您花時間。如前所述,微軟一直在努力讓這個解析器退役,這終於發生了。由可在任何地方使用的編譯服務 Roslyn 提供支持。它已集成到 VS2015 中,據了解調試器也使用它。不是 100% 肯定,我會在 9 天后知道 VS2015 什麼時候發布。也許安裝了 beta/RC 版本的人可以通過評論確認。

更新:確認已在 VS2015 上修復。

同時,在您可以更新之前,解決方法是停止在快速/監視表達式中的可空變數上使用 ToString()。這是越野車。

引用自:https://stackoverflow.com/questions/31311813