5

インターネットとスタックオーバーフローでいくつかの基本的な検索を行ったところ、ジェネリック バージョン メソッドと非ジェネリック バージョン メソッドの両方が関係している場合のオーバーロードの解決に関してかなり多くの議論が見られました。オーバーロードの解決はコンパイル時に行われることを理解しています。したがって、次のコードがある場合:

public class A<T>
{
    public void DoStuff(T value)
    {
         InternalDoStuff(value);
    }

    protected void InternalDoStuff(int value)
    {
         Console.WriteLine("Non-generic version");
    }

    protected void InternalDoStuff(T value)
    {
         Console.WriteLine("Generic version");
    }

}

public class Test
{
    static void Main (string [] args)
    {
         A<int> a = new A<int> ();
         a.DoStuff(100);
    }
}

「InternalDoStuff」の解決がコンパイラによってソートされており、コンパイラが認識するのは「InternalDoStuff が DoStuff の T 型パラメータで呼び出されている」ため、出力は「汎用バージョン」になります。

ただし、これが違いを生むかどうかはわかりません。

public class B : A <int> 
{

}

public class Test
{
    static void Main (string [] args)
    {
         B b = new B ();
         b.DoStuff(100);
    }
}

これで、コンパイラは「B は A の特定のバージョンである」と判断するのに十分な情報を持っていると言えるので、InternalDoStuff の非ジェネリック バージョンを呼び出しますか?

この種の過負荷解決を分析するための一般的な原則はありますか?

4

4 に答える 4

1

ここに画像の説明を入力これにより、「非ジェネリック」バージョンが呼び出されます。

public class A<T>
{
    public virtual void DoStuff(T value)
    {
        InternalDoStuff(value);
    }

    protected void InternalDoStuff(int value)
    {
        Console.WriteLine("Non-generic version");
    }

    protected void InternalDoStuff(T value)
    {
        Console.WriteLine("Generic version");
    }

}
public class B : A<int>
{
    public override void DoStuff(int value)
    {
        InternalDoStuff(value);
    }
}
于 2013-08-20T16:04:13.273 に答える