2015-09-11 88 views
5

我在一個項目中有一個問題,我放置了一個斷點並開始使用對象的屬性,並且我無法將值設置爲可爲空的int。我可以將它設置爲null,但是如果我將它設置爲任何值然後立即檢查該值,則返回1.即時窗口中的設置屬性沒有設置?

我在即時窗口中看到了這一點,以及鼠標懸停時彈出的檢查窗口在調試模式下暫停時的對象。這似乎也不會影響正在運行的代碼,只是當你打破並嘗試使用這些值時。

我能夠重現它在一個新的控制檯項目:

class Program 
    { 
    static void Main(string[] args) 
    { 
     var myValue = new TestItem() 
     { 
     NullableIntValue = null, 
     StringValue = "My test value" 
     }; 

     Console.WriteLine(string.Format("{0} is set to {1}", myValue.StringValue, myValue.NullableIntValue.HasValue ? myValue.NullableIntValue.Value.ToString() : "nothing")); 

     myValue.NullableIntValue = 0; 

     Console.WriteLine(string.Format("{0} is set to {1}", myValue.StringValue, myValue.NullableIntValue.Value)); 

     Console.ReadLine(); 

    } 
    } 

    public class TestItem 
    { 
    public int? NullableIntValue { get; set; } 
    public string StringValue { get; set; } 
    } 

粘貼到一個新的控制檯項目,並把一個破發點在「myValue.NullableIntValue = 0;」線。然後運行它。

當斷點命中,打開立即窗口,並設置值:

myValue.NullableIntValue = 123; 
123 

然後檢查值:

myValue.NullableIntValue = null 
null 
?myValue.NullableIntValue 
null 

?myValue.NullableIntValue 
1 

別的東西試試吧將它設置爲除null之外的任何東西,似乎總是1.

您也可以將鼠標懸停在斷點行「myValue」上並讓VS彈出打開檢查窗口,您可以在其中查看所有值。轉到NullableIntValue並將其設置爲100(或任何其他值),然後按Enter鍵,並立即將其更改爲1.

這似乎只對某個屬性表現爲這種方式,即如果將TestItem.NullableIntValue更改爲變量而不是它的工作正常的財產。如果我給代碼中的NullableIntValue賦值並讓它運行,它似乎不會造成任何問題,只是在調試過程中不中斷。

請注意,在VS 2013中也試過這個,它的任務很好,所以它似乎侷限於VS 2015,並且我嘗試了C#6和C#5,都發生在兩者上。

任何想法可能導致這種情況?

+0

我在我的機器上試過了,無法重現您的問題。 Win 10,Visual Studio 2012,昨晚安裝了最新的VS更新。您的VS2015是否已完全修補? – Christoph

+0

'部分類TestItem'?其他地方是否有其他代碼? – theB

+3

我看到它,這是一個調試器錯誤。這並不令人驚訝,過去它有可空的麻煩。您可以使用工具>選項>調試>常規>使用託管兼容模式作爲解決方法,但它不是一個很好的解決方案。你可以在connect.microsoft.com上報告錯誤 –

回答

2

這是Visual Studio 2015 RTM中的一個已知錯誤。我們在Visual Studio Update 1中修復了它。從調試器到調試過程的複雜值類型(如可空)的基本編組被破壞。如果您不想安裝Update 1,可以轉到Debug - > Options - > General並選中「使用舊版C#和VB Expression Evaluators」來解決此問題。

+0

感謝您的更新@Patrick Nelson - MSFT! – Mike