2015-09-18 47 views
0

考慮下面的類:爲什麼此警告說靜態成員正在「繼承」?

public class A 
{ 
} 

public class B 
{ 
    public static A StaticA { get; set; } 
} 

public class C : B 
{ 
    public static A StaticA { get; set; } 
} 

,這將拋出一個警告:

'C.StaticA' 隱藏繼承成員 'B.StaticA'。如果需要隱藏,請使用新關鍵字。

我可以通過添加new關鍵字擺脫了警告,因爲我說:

public static new A StaticA { get; set; } 

但是我爲什麼要?爲什麼靜態成員被繼承? 就我而言,靜態成員被綁定到一個特定的類型,而不是一個實例。

但是,警告確實說「繼承成員」,所以這些靜態屬性似乎是在事實上繼承。

這是爲什麼?不是針對OOP原則的靜態繼承?

+0

我不認爲這是重複的。也許我應該重新說明我的問題,但是我問爲什麼警告使用「繼承成員」這個詞,事實上,靜態成員**沒有被繼承**,從子類訪問它們只是合成糖。 –

回答

0

這只是警告中單詞的一個糟糕的選擇。該屬性實際上不是繼承,但它是隱藏意義上說,您可以使用繼承類的名稱訪問基本屬性可以

也許更好的警告將

'C.StaticA隱藏了基體 'B.StaticA'。如果需要隱藏,請使用新關鍵字。

另一個原因可能是,其檢測繼承的成員的隱藏相同的靜態分析也檢測靜態成員的隱藏,並且它們只使用兩個相同的消息(靜態和非靜態成員之間沒有區分)