覆盖获取/设置属性仅限获取仍然可以让您设置它

时间:2017-06-27 16:38:06

标签: c# properties override accessor

考虑这个简短的例子:

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()中设置它。为什么这可能?

2 个答案:

答案 0 :(得分:1)

语言不允许你做你想在这里完成的事情。 Liskov替换原则要求派生类可以在预期基类的任何地方替换。要使该属性成立,基类接口的每个可访问成员都必须存在并且可以在派生类中访问。

答案 1 :(得分:1)

通过查看生成的CIL代码,结果证明你通过将其读取只在派生类中读取来覆盖getter方法:

public override bool Property => property;

但仍然继承了setter,所以当你设置属性时,你仍然可以访问基类的setter方法。