为什么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关键字引用当前类实例的基类。但是在静态方法中没有当前实例——它们是静态的而不是实例。
如果在类b中将Func()
方法设置为静态,则可以调用B.Func()
。
c#语言规范在10.6.4覆盖方法(重点是我的):
除非覆盖声明的下列所有条件都为真,否则会发生编译时错误:
…
- 被覆盖的基方法是一个虚拟的、抽象的或覆盖的方法。换句话说,被覆盖的基方法不能是静态的或非虚的。
理论上,可以查看被引用类型的基类。毕竟,类之间的继承关系是在类型而不是实例上定义的。例如,如果我有class A: B
,当出现A.Foo()
时,编译器可以在查找A
类或A.Foo()
中的base
类后查找B中称为Foo
的static virtual
方法,以返回B
中的静态方法列表。然而,我怀疑这是一种编译器优化和语言简化,以避免不得不处理对静态方法列表的引用,以及它可能引起的混乱。