2

重複の可能性:
オーバーロードの解決と仮想メソッド

これを呼び出すと、なぜオブジェクトメソッドが呼び出されているのですか?

Classes.Class2 c = new Classes.Class2();
c.GetJ(1);

public class Class1
{
   public virtual void GetJ(int j)
   {

   }
}

class Class2:Class1
{
    public override void GetJ(int j)
    {
       int j3 = 8;
    }

     public void GetJ(object j)
     {
        int j1 = 82;
     }
}
4

2 に答える 2

1

C# 4.0 仕様を参照してください ( https://www.microsoft.com/en-us/download/details.aspx?id=7029 )

7.4 メンバー検索

最初に、N という名前のアクセス可能なメンバーのセットが決定されます。

  • T が型パラメーターの場合、セットは、アクセス可能なメンバーのセットと共に、T のプライマリ制約またはセカンダリ制約 (§10.1.5) として指定された型のそれぞれで N という名前のアクセス可能なメンバーのセットの和集合です。オブジェクトで N という名前です。

  • それ以外の場合、セットは、T で N という名前のすべてのアクセス可能な (§3.5) メンバーで構成されます。これには、継承されたメンバーと object で N という名前のアクセス可能なメンバーが含まれます。T が構築された型の場合、メンバーのセットは、§10.3.2 で説明されているように、型引数を置き換えることによって取得されます。オーバーライド修飾子を含むメンバーは、セットから除外されます

私はその動作を理解していませんが、これは仕様にあるため、少し邪魔になっても正しいです (そして私は C++ のバックグラウンドを持っています)...

編集:

これは確かに重複した質問です ( Anders Abelのコメントで正しく発見されたように)。

この動作の説明については、元のオーバーロードの解決と仮想メソッドを参照してください。

于 2012-07-31T08:37:25.800 に答える
0

この方法

public void GetJ(object j)
{
    int j1 = 82;
}

継承されたものを非表示にしているのはGetJ(int j)、(そしてそれがどのように機能するかということですが、どのメソッドを呼び出すかをより明示的にする以外にできることはあまりありません)同じ中に適用可能なオーバーライドされていないメソッドがある場合、オーバーライドは使用されません。範囲。つまり、基本的に...コードは意図したとおりに機能します。

于 2012-07-31T08:23:22.187 に答える