【发布时间】:2017-03-29 23:09:26
【问题描述】:
这个完整的 C# 程序说明了这个问题:
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).. 这非常丑陋。 -
根据this question 应该选择最具体的重载。
-
@Steve 这与此处介绍的情况不同,因为它不处理覆盖,C# 规范专门以不同方式处理这种特殊情况。
-
@DavidL 似乎如此。我不知道,很有趣。
标签: c# generics overload-resolution