这个完整的C#程序展示了这个问题:
我遇到了一个StackOverlowException,我追踪到这个调用模式,其中我试图转发调用到一个更具体的重载函数。令我惊讶的是,该调用没有选择更具体的重载函数,而是调用了自身。显然,这与基类型是泛型有关,但我不明白为什么它不会选择Execute(string)重载函数。 请问有人对此有什么见解吗?
上面的代码被简化以显示模式,实际结构略微复杂,但问题是相同的。
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)重载函数。 请问有人对此有什么见解吗?
上面的代码被简化以显示模式,实际结构略微复杂,但问题是相同的。
((Executor<string>)this).Execute((string)item)
。这种写法非常丑陋。 - Rob