[英]Why isn't the overloaded method getting called?
我認為被調用的方法是運行時決定的,還是我錯過了什么? 示例代碼:
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
。 有什么我可以做的,以獲得重載方法而不輸入輸入?
編譯器選擇過載。 對於這里的電話:
internal void DoStuff<T>(T input) where T : SomeBase
{
HiThere(input);
}
它選擇SomeBase
,因為這就是編譯時的全部內容。
你最想要的是覆蓋。 這意味着必須將不同的邏輯放入SomeBase的繼承者中:
abstract class SomeBase
{
abstract string Name { get; }
}
class ImplA : SomeBase{ override string Name { get { return "ImplA"; } } }
class ImplB : SomeBase{ override string Name { get { return "ImplB"; } } }
void HiThere(SomeBase input)
{
Console.WriteLine(input.Name);
}
在編譯期間選擇過載。
在運行時期間選擇覆蓋。
在這里,編譯器只知道T可以分配給SomeBase
,但沒有別的。 實際上,如果它按預期工作,你將能夠完全跳過where T : SomeBase
部分。 您需要它的原因是編譯器需要知道該信息,以便檢查可以在提供的對象上調用的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.