在即时窗口中设置属性未生效?

6
我在一个项目中遇到了问题,我设置了断点并开始使用对象的属性,但是我不能为可空 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
1

尝试使用其他内容:

myValue.NullableIntValue = null
null
?myValue.NullableIntValue
null

将其设置为除null以外的任何值,似乎始终为1。

您还可以悬停在断点行“myValue”上,让VS弹出检查窗口,在那里您可以看到所有值。转到NullableIntValue并将其设置为100(或其他任何内容),然后按Enter,它会立即更改为1。

这似乎只适用于属性,即如果我将TestItem.NullableIntValue更改为变量而不是属性,则可以正常工作。如果在代码中分配一个值给NullableIntValue并让它运行,它似乎毫无问题,只是在调试时没有。

请注意,我也尝试在VS 2013中进行此操作,它可以很好地完成分配,因此它似乎仅限于VS 2015,并且我尝试了C# 6和C# 5,两者都发生了这种情况。

有什么想法是什么原因造成的吗?


我在我的电脑上尝试了一下,但无法重现你的问题。我的系统是Win 10,使用Visual Studio 2012,并在昨晚安装了最新的VS更新。请问你的VS2015是否已经完全打过补丁了? - Christoph
partial class TestItem?它是否还有其他地方的附加代码? - theB
3
我明白了,这是一个调试器的bug。 这并不令人惊讶,因为在过去它处理nullable时曾经遇到过很多问题。 你可以使用“工具”>“选项”>“调试”>“常规”>“使用托管兼容性模式”作为一种解决方法,但这不是一个很好的解决方法。 你可以到connect.microsoft.com上报告这个bug。 - Hans Passant
@theB - 不好意思,那是我在做测试时留下的。删除“partial”仍然存在问题。我现在会编辑问题。 - Mike
@Christoph - 这个问题只在VS2015中出现。我已经安装了最新版本。在VS2013中没有问题,我认为在VS2012中也不会有问题。 - Mike
@Mike 那只是一个不太可能的尝试。 - theB
1个回答

3

这是Visual Studio 2015 RTM中已知的一个bug。我们在Visual Studio Update 1中修复了它。实际上,将复杂的值类型(如可空类型)从调试器传递到被调试进程时出现了问题。如果您不想安装Update 1,则可以通过转到“调试” -> “选项” -> “常规”,并勾选“使用旧版C#和VB表达式计算器”来解决该问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接