与えられた:
class BaseClass
{
public virtual void M(int x)
{
}
}
class Derived : BaseClass
{
public override void M(int x)
{
base.M(x);
}
static void M(object x)
{
}
static void Main()
{
var d = new Derived();
d.M(0);
}
}
エラー:
メンバー'Derived.M(object)'は、インスタンス参照ではアクセスできません。代わりにタイプ名で修飾してください
C#4.0仕様のセクション7.4(メンバールックアップ)を見ると、最初の箇条書きは次のようになっています。
タイプTのKタイプパラメータを持つ名前Nのメンバールックアップは、次のように処理されます。
[...]オーバーライド修飾子を含むメンバーは、[Nという名前のアクセス可能なメンバーの]セットから除外されます
Derived.M
このことから、オーバーライドにはアクセスできなくなったと結論付けます。代わりに、コンパイラはを参照する必要がありますBaseClass.M
。
Derived.M
ただし、これは、スタティックを追加すると突然コンパイルエラーが発生する理由を説明していません。コンパイラーは静的メンバーのみを認識できるよう Derived.M
になり、このメンバーは無効な呼び出しであると結論付けます。スタティックを削除するとDerived.M
、コンパイルは成功します。
なぜこれが起こるのですか?