Код, который у вас есть, эквивалентен следующему коду:
public struct DealImportRequest
{
private DealRequestBase _dr;
private int _irc;
public DealRequestBase DealReq
{
get { return _dr; }
set { _dr = value; }
}
public int ImportRetryCounter
{
get { return _irc; }
set { _irc = value; }
}
/* Note we aren't allowed to do this explicitly - this is didactic code only and isn't allowed for real*/
public DealImportRequest()
{
this._dr = default(DealRequestBase); // i.e. null or default depending on whether this is reference or value type.
this._irc = default(int); // i.e. 0
}
public DealImportRequest(DealRequestBase drb)
{
this.DealReq = drb;
this.ImportRetryCounter = 0;
}
}
Теперь все, что я сделал здесь, это удалил синтаксический сахар, который:
- Реализует автоматические свойства.
- Определяет, с какими членами обращаются относительно
this
. - Предоставляет все
struct
sa конструктор по умолчанию без параметров.
Первые дванеобязательный (вы могли бы написать их явно, если хотите), но третий - нет - нам не разрешено писать наш собственный код для конструктора без параметров struct
, мы должны использовать тот, который работает как тот, что вприведенный выше код предоставляется нам автоматически.
Теперь, если посмотреть здесь, внезапно становится понятным значение двух ошибок - ваш конструктор неявно использует this
до того, как его поля будут назначены (ошибка 188) и эти поляэто те, которые поддерживают автоматические свойства (ошибка 843).
Это комбинация различных автоматических функций, о которых нам обычно не нужно думать, но в этом случаене работает хорошоМы можем исправить это, следуя совету в сообщении об ошибке для 843 и вызывая конструктор по умолчанию как часть вашего явного конструктора:
public DealImportRequest(DealRequestBase drb)
:this()
{
DealReq = drb;
ImportRetryCounter = 0;
}
Учитывая это в связи с моей расширенной версией вашего кода выше, вы можетеПосмотрите, как это решает проблему, потому что он вызывает конструктор, который присваивает вспомогательные поля, прежде чем продолжить.