Отладчик Visual Studio падает при наборе виртуального свойства - PullRequest
2 голосов
/ 18 апреля 2019

У меня есть 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);, где left и right - экземпляры SimpleData, и перехожу к конструкторам, пока не достигнуприсваивание свойства Left в DataDiff сбой отладчика.

Программа 'program.exe' завершила работу с кодом -2147023895 (0x800703e9).

Когда я попытался изменить свойство в Data на public Data Left { get; private set; }
и в SimpleData на public new SimpleData Left { get; }, оно перестало падать.
Вот почему я подумал, что это может иметь какое-то отношение к виртуальному ключевому слову.
Я что-то упускаю здесь очевидное?

Кроме того, если я перехожу через вызов конструктора, отладчик не падает, но если я пытаюсь открыть объект DataDiff на вкладке Locals отладчика, он вылетает.

Может кто-нибудь объяснить мне, почему это происходит?

Изменить:

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; }
}

Я использую Visual Studio 2013

1 Ответ

2 голосов
/ 19 апреля 2019

В вашем 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.

...