私は、呼び出されているメソッドが実行時に決定されたと思ったのですが、何かを逃したのですか?サンプルコード:オーバーロードされたメソッドが呼び出されないのはなぜですか?
class Program
{
static void Main(string[] args)
{
var magic = new MagicClass();
magic.DoStuff(new ImplA());
magic.DoStuff(new ImplB());
Console.ReadLine();
}
}
class MagicClass
{
internal void DoStuff<T>(T input) where T : SomeBase
{
HiThere(input);
}
void HiThere(SomeBase input)
{
Console.WriteLine("Base impl");
}
void HiThere(ImplA input)
{
Console.WriteLine("ImplA");
}
void HiThere(ImplB input)
{
Console.WriteLine("ImplB");
}
}
abstract class SomeBase
{
}
class ImplA : SomeBase{}
class ImplB : SomeBase{}
私はなるだろうと思った:
ImplA
ImplB
出力としてではなく、それはBase impl
を印刷します。入力をキャストせずにオーバーロードされたメソッドを取得するためにできることはありますか?
ここにはかなりまともな説明があります:http://csharpindepth.com/Articles/General/Overloading.aspx –