13

我正在阅读《C# Language》一书,并从 Vladimir Reshetnikov 那里得到了这个注解:

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

我可以知道为什么吗?具有受保护成员的静态类有什么问题?静态类可以有私有成员所以我猜这个 CS1057 错误不是由于可访问性,但可能是由于编译问题?作为受保护的成员可以在子类中被覆盖......但我不知道为什么。

4

3 回答 3

17

因为您不能继承静态类,所以protected没有任何用途 - 只有在这里才有意义。publicprivate

更多细节可以在这里找到:为什么我不能继承静态类?

于 2011-07-02T16:57:02.400 回答
3

受保护的成员意味着可以从子/派生类访问它们。但是静态类的主要特点是:

  1. 只包含静态成员;

  2. 无法实例化;

  3. 被密封。

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

于 2011-07-02T17:01:42.410 回答
0

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

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

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

(小小)

于 2015-09-21T10:25:14.233 回答