为什么base关键字不能用于静态方法?

时间:2013-01-07 12:05:39

标签: c#

为什么我们不能使用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();
    }
}

2 个答案:

答案 0 :(得分:14)

因为base关键字指的是当前类实例的基类。但是你没有静态方法中的当前实例 - 它们是静态的而不是实例。

如果您在B级中将B.Func()方法设为静态,则可以致电Func()

答案 1 :(得分:1)

10.6.4覆盖方法(强调我的)中的C# Language Specification个州:

  

发生编译时错误,除非对覆盖声明满足以下所有条件:

     

...

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

从理论上讲,可以查看引用类型的基类。毕竟,类之间的继承关系是在类型上定义的,而不是在实例上定义的。例如,如果我有class A: B,则在显示A.Foo()时,编译器可以在查看类static virtual后在B中查找名为Foo的{​​{1}}方法或A中的base返回A.Foo()中的静态方法列表。但是,我怀疑这是一个编译器优化和语言简化,以避免只处理对静态方法列表的引用以及它将导致的混淆。