考虑这个简短的例子:
class Program
{
private abstract class PropertyExample
{
public virtual bool Property { get; set; }
}
private class GetOnlyProperty : PropertyExample
{
private bool property = false;
public override bool Property => property;
}
static void Main(string[] args)
{
GetOnlyProperty example = new GetOnlyProperty();
example.Property = true;
}
}
即使我将Property
类中的GetOnlyProperty
覆盖为仅限get,我仍然可以在Main()
中设置它。为什么这可能?
答案 0 :(得分:1)
语言不允许你做你想在这里完成的事情。 Liskov替换原则要求派生类可以在预期基类的任何地方替换。要使该属性成立,基类接口的每个可访问成员都必须存在并且可以在派生类中访问。
答案 1 :(得分:1)
通过查看生成的CIL代码,结果证明你通过将其读取只在派生类中读取来覆盖getter方法:
public override bool Property => property;
但仍然继承了setter,所以当你设置属性时,你仍然可以访问基类的setter方法。