Самый простой способ объяснить это - рассмотреть, какой код генерирует компилятор для его реализации.
Базовый класс эквивалентен этому:
public class TestBase
{
public virtual string ReadOnly => _testBaseReadOnly;
public TestBase()
{
_testBaseReadOnly = "from base";
}
readonly string _testBaseReadOnly;
}
Производный класс эквивалентенна это:
class Test : TestBase
{
public override string ReadOnly => _testReadOnly;
readonly string _testReadOnly;
}
Здесь важно отметить, что у производного класса есть СОБСТВЕННОЕ ПОЛЕЗНОЕ ПОЛОЖЕНИЕ для ReadOnly
- он НЕ повторно использует класс базового класса.
Поняв это, должно быть понятно, почему переопределенное свойство имеет значение null.
Это потому, что у производного класса есть собственное поле поддержки для ReadOnly
, и его конструктор не инициализирует это поле поддержки.
Кстати, если вы используете Resharper
, он действительно предупредит вас, что вы не устанавливаете ReadOnly
в производном классе:
"Get-only auto-property 'ReadOnly' is never assigned."