Visual Studio 调试器在一组虚拟 属性 上崩溃

Visual Studio debugger crashes on set of a virtual property

我有 2 个 类、DataDiffSimpleDataDiffSimpleDataDiff 继承 DataDiffDataDiff 有两个虚拟属性,SimpleDataDiff 覆盖了两个。我正在使用 Visual Studio 2013.

它们看起来像这样:

class DataDiff
{
  public virtual Data Left { get; private set; }
  public virtual Data Right { get; private set; }

  public DataDiff(Data left, Data right)
  {
    Left = left; // Debugger crash
    Right = right;
  }
}
class SimpleDataDiff : DataDiff
{
  public override Data Left
  {
    get { return Left as SimpleData; }
  }

  public override Data Right
  {
    get { return Right as SimpleData; }
  }

  public SimpleDataDiff(SimpleData left, SimpleData right) :
    base(left, right)
  {
  }
}

DataSimpleData只包含一些变量,SimpleData继承Data.

现在,如果我调试像 SimpleDataDiff diff = new SimpleDataDiff(left, right); 这样的行,其中左右是 SimpleData 的实例,然后进入构造函数,直到我到达 Left [=50= 的赋值] 在 DataDiff 中调试器崩溃。

The program 'program.exe' has exited with code -2147023895 (0x800703e9).

当我尝试将 Data 中的 属性 更改为 public Data Left { get; private set; } 以及 SimpleData 中的 public new SimpleData Left { get; } 时,它不再崩溃。这就是为什么我认为它可能与 virtual 关键字有关。我在这里遗漏了什么明显的东西吗?

此外,如果我跳过构造函数调用,调试器不会崩溃,但如果我尝试在调试器的“本地”选项卡中打开 DataDiff 对象,它就会崩溃。有人可以向我解释为什么会这样吗?

public class Data
{
  public string Shortname { get; set; }
  public uint StartByte { get; set; }   
  public uint ByteLen { get; set; }
}
class SimpleData : Data
{
  public bool IsHighLowByteOrder { get; set; }
  public uint StartBit{ get; set; }
  public uint BitLen { get; set; }
}

在您的 SimpleDataDiff 派生 class 中,您正在覆盖基础 class 属性,如下所示:

public override Data Left
{
    get { return Left as SimpleData; }
}

此结果是循环解析尝试,因为调试器会在您单步执行代码时尝试解析引用。这真的应该是:

public override Data Left
{
    get { return base.Left; } // the 'as SimpleData' is not necessary
}

奇怪的是,这不会在 Visual Studio 2015 上(或者显然在 VS 2013 上)生成警告。您可能需要考虑向 Microsoft 提交问题。