8

次のコードを検討してください。

static void Main(string[] args)
{
   Get<Student>(new Student());
    System.Console.Read();
}

public static void Get<T>(T person)
{
    Console.WriteLine("Generic function");
}
public static void Get(Person person)
{
    person.Show();
}

これは私のPersonクラスです:

class Person
{
    public void Show()
    {
        Console.WriteLine("I am person");
    }
}
class Student : Person
{
    public new void Show()
    {
        Console.WriteLine("I am Student");
    }
}

Studentを呼び出しGetてメソッドに渡します。次のようにします。

 Get<Student>(new Student());

だから私はこれを取得します:.しかし、私がこのようGeneric functionに呼び出すとGet:

 Get(new Student());

これが呼び出されることを期待しGet(Person person)ていますが、もう一度 call: Get<T>(T person). コンパイラがこの動作をするのはなぜですか?

4

1 に答える 1

12

Jon Skeet の著書 C# in Depth (現時点では第 2 版) の章番号 9.4.4 を参照できます。あなたの状況に合うようにテキストを変更しました。

適切なオーバーロード メソッドの選択

この時点で、コンパイラは Student から Student への変換、および Student から Person への変換を考慮します。任意の型からそれ自体への変換は、別の型への変換よりも優れていると定義されているため、この特定の呼び出しでは、T を Student メソッドとして使用する Get(T x) の方が Get(Person y) よりも優れています。

この本にはもう少し説明がありますが、少なくとも徹底的に読むことを強くお勧めします.

于 2013-09-22T09:30:56.743 に答える