强插的get/set属性被获取,只有您仍然可以将其设置

问题描述:

考虑这个简单的例子:强插的get/set属性被获取,只有您仍然可以将其设置

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

即使我在GetOnlyProperty类推翻Property是获得只,我仍然能将其设置为Main()。为什么这可能?

+0

不要重载,将其标记为'new' –

+0

@MohamedAhmed仍然不会删除设置属性值的功能。 – Servy

+0

他不能用当前'GetOnlyProperty'类型的'''对象' –

通过查看生成的CIL代码,事实证明,您被makking它重写getter方法只在派生类阅读:

public override bool Property => property; 

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

该语言不能让你做你正在尝试完成的事情。 Liskov替换原则要求派生类可以在任何需要基类的地方替代。要使该属性成立,基类接口的每个可访问成员都必须存在,并且可以在派生类中访问。

+1

那么为什么编译器不会发出警告或错误?疏忽也许? –

+0

@DomnWerner - 可能,尽管你选择的语法并不完全清楚,但你打算重写setter方法。 – hoodaticus

+1

你是说我只覆盖getter?我的理解是,我压倒了财产本身。 –