Эта полная программа на С# иллюстрирует проблему:
public abstract class Executor<T>
{
public abstract void Execute(T item);
}
class StringExecutor : Executor<string>
{
public void Execute(object item)
{
// why does this method call back into itself instead of binding
// to the more specific "string" overload.
this.Execute((string)item);
}
public override void Execute(string item) { }
}
class Program
{
static void Main(string[] args)
{
object item = "value";
new StringExecutor()
// stack overflow
.Execute(item);
}
}
Я столкнулся с исключением StackOverlowException, которое я проследил до этого шаблона вызова, где я пытался перенаправить вызовы на более конкретную перегрузку. К моему удивлению, вызов не выбирал более специфическую перегрузку, а вызывал обратно в себя. Очевидно, что это связано с тем, что базовый тип является общим, но я не понимаю, почему он не будет выбирать перегрузку Execute (string).
Кто-нибудь может понять это?
Приведенный выше код был упрощен, чтобы показать шаблон, фактическая структура немного сложнее, но проблема одна и та же.