我刚刚碰到的理论问题的时间。
以下代码有效并编译:
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
自动属性,导致部分不可预测的行为?是否有实际应用?
我可以使用父设置器设置TestProperty的值(我检查了生成的IL并且setter仍在父类中设置支持对象),即使公众无法访问值。
答案 0 :(得分:12)
此行为与C#中的非自动实现的属性一致。始终只能覆盖虚拟属性的get或set方法。因此,无法使用自动实现的属性会产生不必要的不一致。
例如,以下是合法的
class A
{
public virtual int P1
{
get { return 42; }
set { }
}
}
class B : A
{
public override int P1
{
get { return 18; }
}
}
答案 1 :(得分:1)
然而,对于一个二传手来说,它没有意义吗?如果你只部分覆盖了setter,那么除了调用base.TestProperty = value
之外,这可能是有用的,这样你就可以响应那个事件,而不必费心去除getter的样板覆盖。