gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:54:57 26 4
gpt4 key购买 nike

我有 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); 这样的行,其中 left 和 right 是 SimpleData 的实例,然后进入构造函数,直到我到达 DataDiffLeft 属性的赋值,调试器崩溃。

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

当我尝试将 Data 中的属性更改为 public Data Left { get;私有(private)集; }并在 SimpleDatapublic 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; }
}

最佳答案

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

关于c# - Visual Studio 调试器在一组虚拟属性上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55748667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com