インターネットとスタックオーバーフローでいくつかの基本的な検索を行ったところ、ジェネリック バージョン メソッドと非ジェネリック バージョン メソッドの両方が関係している場合のオーバーロードの解決に関してかなり多くの議論が見られました。オーバーロードの解決はコンパイル時に行われることを理解しています。したがって、次のコードがある場合:
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 の非ジェネリック バージョンを呼び出しますか?
この種の過負荷解決を分析するための一般的な原則はありますか?