2

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

2 回答 2

16

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

B.Func() 如果您Func()在 B 类中将方法设为静态,您将能够调用。

于 2013-01-07T12:06:55.590 回答
1

C# 语言规范在第10.6.4节覆盖方法(强调我的)中声明:

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

...

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

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

于 2013-01-07T12:22:40.363 回答