Вы ссылаетесь на свойство с полем readonly
.
Это именно то, что компилятор также генерирует из C # 6 и выше при использовании автоматически реализуемого свойства со значением по умолчанию:
int MyProperty { get; } = -1;
Это будет переведено на следующее:
readonly int _myProperty = -1;
int MyProperty { get { return this._myProperty; } }
Теперь компилятор заменяет каждый вызов вашего свойства на вспомогательное поле. Однако это работает только для авто-свойств, для которых не определено тело. В вашем случае у вас уже есть такой, поэтому компилятор не может заменить его. Поскольку само свойство - это не что иное, как метод get и set, то, что вы хотите сделать, это следующее, что очевидно бессмысленно:
int get_MyProperty() { return this._MyProperty; }
...
this.get_MyProperty() = 1;
Причина, по которой это работает для автоматического свойства, заключается в том, что компилятор знает, как заменить вызов свойства. Однако предположим, что ваш собственный получатель был более сложным:
get
{
DoSomething();
return this._myProperty + 5;
}
Теперь компилятор не может заменить вызов свойства.
Таким образом, единственный способ получить собственную реализацию get вместе со свойством, предназначенным только для get, - это использовать поле поддержки:
this._myProperty = 1;