为什么我们不能使用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();
}
}
答案 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()
中的静态方法列表。但是,我怀疑这是一个编译器优化和语言简化,以避免只处理对静态方法列表的引用以及它将导致的混淆。