为什么base关键字不能在静态方法中使用

本文关键字:静态方法 base 关键字 不能 为什么 | 更新日期: 2023-09-27 17:50:50

为什么在静态方法中不能使用base关键字来使用基类方法?

两者在编译时都可用。

class A
{ 
    public virtual void Func(int a=4){
        Console.WriteLine(" A Class: "+a);
    }
}
class B : A
{
    public new void Func(int a = 12)
    {
        Console.WriteLine(" B Class: "+ a);
    }
}
class C : B
{
    public static void Func()
    {
        base.Func();  // why not ????
    }
}
public class Program
{
    public static void Main(string[] args)
    {
        B ob = new C();
        ob.Func();
        Console.ReadLine();
    }
}

为什么base关键字不能在静态方法中使用

因为base关键字引用当前类实例的基类。但是在静态方法中没有当前实例——它们是静态的而不是实例。

如果在类b中将Func()方法设置为静态,则可以调用B.Func()

c#语言规范在10.6.4覆盖方法(重点是我的):

除非覆盖声明的下列所有条件都为真,否则会发生编译时错误:

  • 被覆盖的基方法是一个虚拟的、抽象的或覆盖的方法。换句话说,被覆盖的基方法不能是静态的或非虚的。

理论上,可以查看被引用类型的基类。毕竟,类之间的继承关系是在类型而不是实例上定义的。例如,如果我有class A: B,当出现A.Foo()时,编译器可以在查找A类或A.Foo()中的base类后查找B中称为Foostatic virtual方法,以返回B中的静态方法列表。然而,我怀疑这是一种编译器优化和语言简化,以避免不得不处理对静态方法列表的引用,以及它可能引起的混乱。