部分覆盖子类中的虚拟自动属性

Jus*_*ner 21 c# theory inheritance

我刚遇到一个理论问题的时候了.

以下代码有效并编译:

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; }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

为什么C#允许我部分覆盖TestProperty孩子的auto属性,导致部分不可预测的行为?有实际应用吗?

我被允许使用父设置器设置TestProperty的值(我检查了生成的IL,并且设置器仍在父类中设置支持对象),即使公众无法访问值.

Jar*_*Par 12

此行为与C#中的非自动实现的属性一致.始终只能覆盖虚拟属性的get或set方法.因此,无法使用自动实现的属性会产生不必要的不​​一致.

例如,以下是合法的

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

class B : A
{
    public override int P1
    {
        get { return 18; }
    }
}
Run Code Online (Sandbox Code Playgroud)