声明一个静态类并声明一个受保护成员

13
我正在阅读书籍"C#语言",并注意到Vladimir Reshetnikov的这个注释:

如果静态类声明了受保护或受保护内部成员,则会出现编译时错误(CS1057)。

请问为什么? 静态类有受保护的成员有什么问题? 静态类可以有私有成员,因此我猜测这个CS1057错误不是由于可访问性,而可能是由于编译问题?因为受保护的成员可以在子类中被覆盖...但我无法弄清楚原因。
3个回答

18
因为无法继承静态类,所以protected没有意义——只有publicprivate才有意义。
更多细节可以在这里找到:为什么无法继承静态类?

4
虽然这是暗示,但我认为在你的回答中明确说明“private”成员是可以的会更好。 - tehDorf
@tehDorf,问题本身就提到了:“静态类可以有私有成员”- 抱歉,我看不出将其添加到答案中的意义所在。 - Shadow The Spring Wizard
1
@ShadowWizard 啊,抱歉,我错过了那个。我是通过谷歌链接到这里的,不知道私有成员是允许的,而且我没有完全阅读他的帖子。感谢您的回答。 - tehDorf

3

保护成员的意思是它们可以被子类或派生类访问。但是静态类的主要特征是:

  1. 只包含静态成员;

  2. 无法实例化;

  3. 是密封的。

这就是为什么静态类不能有保护成员的原因。


0

.NET 中的继承仅适用于实例。静态方法是在类型级别而不是实例级别上定义的。这就是为什么覆盖静态方法/属性/事件不起作用的原因...

静态方法只在内存中保留一次。没有为它们创建虚拟表等。

如果在 .NET 中调用实例方法,则始终将其提供给当前实例。这由 .NET 运行时隐藏,但确实发生了。每个实例方法都有一个指向运行该方法的对象的指针(引用)作为第一个参数。这对于静态方法(因为它们是在类型级别上定义的)不会发生。编译器应该如何决定选择要调用的方法?

(littleguru)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接