顾名思义,private
成员不可覆盖。 如果您希望setter被覆盖,您可以将其标记为protected
而不是private
。
private abstract class InheritanceTest
{
public virtual object Property
{
get { return null; }
protected set { }
}
public class Child : InheritanceTest
{
public override object Property
{
get { return null; }
protected set { base.Property = null; }
}
}
}
为了更具体地回答你的问题,以为什么:
理解的是,当你的C#代码被编译成IL代码,实际上最终是三样东西1财产。
Property
属性本身。
- 名为
get_Property()
的方法是吸气剂。
- 方法名称
set_Property()
这是设置者。
在你的代码,你告诉.NET说:“我希望有一个virtual
的属性,它然后访问级别的getter和setter方法级联。事实上,在IL代码,性能不指定virtual
在所有。
对于C#代码:
public virtual object Property { get; set; }
所生成的IL代码是:
.property instance object Property() { ... }
.method public hidebysig newslot specialname virtual
instance object get_Property() cil managed
{ ... }
.method public hidebysig newslot specialname virtual
instance object set_Property() cil managed
{ ... }
请注意,public
和virtual
关键字既适用于getter方法,也适用于setter方法,但不适用于属性本身。
现在,通过改变你的C#代码:您希望您的getter和setter方法是虚拟
public virtual object Property { get; private set; }
你告诉.NET ...但是,然后将它运行到private set
,和访问级别覆盖public
和virtual
访问级别,用于setter方法。因此,生成的IL代码变为:
.property instance object Property() { ... }
.method public hidebysig newslot specialname virtual
instance object get_Property() cil managed
{ ... }
.method private hidebysig newslot specialname
instance object set_Property() cil managed
{ ... }
注意,现在set_Property()
是private
,并且不再virtual
。在.NET中实际上不可能有一个private virtual
,因为它没有意义......这就像试图说“没有其他类可以看到这个......但派生类可以重写这个东西,他们可以'没有看到或访问“这是没有意义的。派生类不能覆盖他们甚至看不到的东西。
protected
关键字在这种情况下是正确的替代品,因为它告诉.NET“只有我自己和派生类可以看到或访问它,并且派生类可以覆盖此属性。”
所以我猜这个“短”的答案会刚刚“因为事情不能在.NET private
和virtual
,所以编译器需要你给它的更严格的访问级别。
而且, IMO该错误消息是相当正确
“Program.InheritanceTest.Child.Property.set”:无法重写继承的成员“Program.InheritanceTest.Property.set”,因为它未标记虚拟的,抽象的,或覆盖
请注意,它说的是'Program.InheritanceTest.Property.set'
,所以最后的“.set”是指最终的set_Property()
方法,而不是Property
属性。并且set_Property()
方法仅标记为private
,因为.NET编译器看到该方法,并从该方法中删除了virtual
,原因如上所述。我想假设有一个编译器警告或者说'虚拟'将被忽略'set''会有些意义。
希望更有意义......
的可能重复[为什么在C#中的非法私人虚拟方法?(http://stackoverflow.com/questions/3082310/why-are-private-virtual-方法非法在C) – McKay 2012-01-29 05:43:23
我已投票结束这个问题作为重复。我会鼓励其他人也这样做。 – McKay 2012-07-17 20:31:14