强插的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()
。为什么这可能?
通过查看生成的CIL代码,事实证明,您被makking它重写getter方法只在派生类阅读:
public override bool Property => property;
,但仍然继承了二传手,所以当你设置属性,你仍然可以访问基类的setter方法。
该语言不能让你做你正在尝试完成的事情。 Liskov替换原则要求派生类可以在任何需要基类的地方替代。要使该属性成立,基类接口的每个可访问成员都必须存在,并且可以在派生类中访问。
那么为什么编译器不会发出警告或错误?疏忽也许? –
@DomnWerner - 可能,尽管你选择的语法并不完全清楚,但你打算重写setter方法。 – hoodaticus
你是说我只覆盖getter?我的理解是,我压倒了财产本身。 –
不要重载,将其标记为'new' –
@MohamedAhmed仍然不会删除设置属性值的功能。 – Servy
他不能用当前'GetOnlyProperty'类型的'''对象' –