相关疑难解决方法(0)

C#方法重载决策没有选择具体的通用覆盖

这个完整的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); 
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到了一个StackOverlowException,我追溯到这个调用模式,我试图将调用转发给更具体的重载.令我惊讶的是,调用并没有选择更具体的重载,而是回调自身.它显然与基类型是通用的有关,但我不明白为什么它不会选择执行(字符串)重载.

有没有人对此有任何见解?

上面的代码被简化为显示模式,实际结构有点复杂,但问题是一样的.

c# generics overload-resolution

45
推荐指数
3
解决办法
2309
查看次数

标签 统计

c# ×1

generics ×1

overload-resolution ×1