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

时间:2019-04-18 14:55:09

标签: c# visual-studio debugging crash

我有2个课程,DataDiffSimpleDataDiffSimpleDataDiff继承了DataDiff

DataDiff有两个虚拟属性,SimpleDataDiff覆盖了这两个属性。

它们看起来像这样:

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的实例并进入构造函数,直到我在{{1}中分配了Left属性}调试器崩溃。

  

程序'program.exe'已退出,代码为-2147023895(0x800703e9)。

当我尝试将DataDiff中的属性更改为Data
时 在public Data Left { get; private set; }SimpleData中 它停止崩溃了。
这就是为什么我认为它可能与虚拟关键字有关。
我在这里想念一些明显的东西吗?

此外,如果我跳过构造函数调用,则调试器不会崩溃,但是如果我尝试在调试器的“本地”选项卡中打开public new SimpleData Left { get; }对象,则会崩溃。

有人可以向我解释为什么会这样吗?

编辑:

DataDiff
public class Data
{
  public string Shortname { get; set; }
  public uint StartByte { get; set; }   
  public uint ByteLen { get; set; }
}

我正在使用Visual Studio 2013

1 个答案:

答案 0 :(得分:2)

SimpleDataDiff派生类中,您将像这样重写基类属性:

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提出问题。