2015-09-18 46 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'。如果需要隐藏,请使用新关键字。

另一个原因可能是,其检测继承的成员的隐藏相同的静态分析也检测静态成员的隐藏,并且它们只使用两个相同的消息(静态和非静态成员之间没有区分)