Частичное переопределение виртуального авто-имущества в дочернем классе

Время для теоретического вопроса, с которым я только что столкнулся.

Следующий код действителен и компилируется:

public class Parent
{
    public virtual object TestProperty { get; set; }
}

public class Child : Parent
{
    private string _testValue = "Hello World!";

    public override object TestProperty
    {
        get { return _testValue; }
    }
}

public class Consumer
{
    Parent p = new Child();

    public Consumer(){ p.TestProperty = 3; }
}

Мой вопрос:

Почему С# позволяет частично переопределить свойство TestProperty auto в дочернем, когда это приводит к частично непредсказуемому поведению? Есть ли практическое приложение?

Мне разрешено устанавливать значение TestProperty с помощью родительского сеттера (я проверил генерируемый IL, а сеттер по-прежнему устанавливает объект поддержки в родительском классе), хотя значение не доступно для публики.

Ответ 1

Это поведение совместимо с неавторизованными свойствами в С#. Всегда можно было переопределить только метод get или set для виртуального свойства. Следовательно, невозможность сделать это с автоматически реализованным свойством создаст ненужную несогласованность.

Например, следующее правовое

class A
{
    public virtual int P1
    {
        get { return 42; }
        set { }
    }
}

class B : A
{
    public override int P1
    {
        get { return 18; }
    }
}

Ответ 2

Разве это не имеет смысла для сеттера? Если вы частично переопределяете только установщик, это может быть полезно, чтобы вы могли ответить на это событие, помимо вызова base.TestProperty = value, не беспокоясь о переопределении шаблона для получателя.