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 キーワードは、現在のクラスinstanceの基本クラスを参照しているためです。しかし、静的メソッドには現在のインスタンスがありません。それらはインスタンスではなく静的です。

クラスBでメソッドを静的にB.Func() すれば呼び出せるようになります。Func()

于 2013-01-07T12:06:55.590 に答える
1

C# 言語仕様のセクション10.6.4 オーバーライド メソッド(強調鉱山) で次のように述べています。

次のすべてがオーバーライド宣言に当てはまらない限り、コンパイル時エラーが発生します。

...

  • オーバーライドされた基本メソッドは、仮想メソッド、抽象メソッド、またはオーバーライド メソッドです。つまり、オーバーライドされた基本メソッドを静的または非仮想にすることはできません。

理論的には、参照される型の基本クラスを調べることができる場合があります。結局のところ、クラス間の継承関係はインスタンスではなく型で定義されます。たとえば、私が を持っている場合、 が与えられclass A: BたときA.Foo()、コンパイラはクラス内を検索した後にstatic virtual呼び出される B 内のメソッドを探すか、 in 内の静的メソッドのリストを返すために inを探すことができます。ただし、これは、静的メソッドのリストのみへの参照を処理する必要がなく、それが引き起こす混乱を避けるためのコンパイラの最適化と言語の簡素化であると思われます。FooAbaseA.Foo()B

于 2013-01-07T12:22:40.363 に答える