我有2个课程,DataDiff
和SimpleDataDiff
。 SimpleDataDiff
继承了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)
{
}
}
Data
和SimpleData
仅包含一些变量,而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
答案 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提出问题。