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

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

以下代码有效并编译:

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; } } 

我的问题是:

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

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

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

例如,以下是合法的

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

但是,对于一个二传手来说,这不是很有意义吗? 如果你只部分覆盖了setter,那么除了调用base.TestProperty = value之外,这可能是有用的,这样你就可以响应那个事件,而不必费心base.TestProperty = value getter的样板覆盖。