【问题标题】:Visual Studio debugger crashes on set of a virtual propertyVisual Studio 调试器在虚拟属性集上崩溃
【发布时间】:2019-04-18 14:55:08
【问题描述】:

我有 2 个课程,DataDiff 和 SimpleDataDiff。 SimpleDataDiff 继承 DataDiff。 DataDiff 有两个虚拟属性,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)
  {
  }
}

Data 和SimpleData 只保存一些变量,SimpleData 继承Data。

现在,如果我调试像 SimpleDataDiff diff = new SimpleDataDiff(left, right); 这样的行,其中 left 和 right 是 SimpleData 的实例,然后进入构造函数,直到在 Left 中分配 Left 属性,调试器就会崩溃。

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

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

此外,如果我跳过构造函数调用,调试器不会崩溃,但如果我尝试在调试器的 Locals 选项卡中打开 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; }
}

【问题讨论】:

  • 请贴出Data和SimpleData的类定义,以及你使用的VS版本。

标签: c# visual-studio debugging crash


【解决方案1】:

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

【讨论】:

  • 如果我不需要as SimpleData,我就不能完全摆脱覆盖并使用基本属性吗?
  • 是的,你可以。派生类的一个常见场景是实现它自己的强类型属性,如public SimpleData SimpleLeft,并在基类属性的覆盖中返回该属性的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多