Visual Studio 调试器在一组虚拟 属性 上崩溃
Visual Studio debugger crashes on set of a virtual property
我有 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);
这样的行,其中左右是 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 提交问题。
我有 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);
这样的行,其中左右是 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 提交问题。