顧名思義,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