重载方法中的StackOverflowException

时间:2011-07-05 14:26:06

标签: c# exception-handling overloading stack-overflow overload-resolution

我正试图在这样的代码中调用重载方法:

public abstract class BaseClass<T>
{
    public abstract bool Method(T other);
}

public class ChildClass : BaseClass<ChildClass>
{
    public bool Method(BaseClass<ChildClass> other)
    {
        return this.Method(other as ChildClass);
    }

    public override bool Method(ChildClass other)
    {
        return this == other;
    }
}

class Program
{
    static void Main(string[] args)
    {
        BaseClass<ChildClass> baseObject = new ChildClass();
        ChildClass childObject = new ChildClass();

        bool result = childObject.Method(baseObject);
        Console.WriteLine(result.ToString());
        Console.Read();
    }
}

一切看起来都不错,但抛出了StackOverflowException。 根据我的理解,如果我调用重载方法,则应调用最具体的方法版本,但在这种情况下调用Method(BaseClass<ChildClass> other)而不是Method(ChildClass other)

但是当我使用演员时:

return ((BaseClass<ChildClass>)this).Method(other as ChildClass);

一切都按预期工作。 我错过了一些吗?或者这是.NET中的一个错误? 在.NET 2.0,3.5,4.0中测试

1 个答案:

答案 0 :(得分:2)

Section 7.3 of the C# spec州:

  

首先,所有可访问的集合   (第3.5节)名为N的成员声明   在T和基础类型(部分   构建了T的7.3.1)。 包含覆盖的声明   修饰符从集合中排除。如果   没有名为N的成员存在且是   可访问,然后查找产生   不匹配,以下步骤   没有评估。

由于两种方法都适用,但其中一种方法被标记为覆盖,因此为了确定调用哪种方法,将忽略它。因此,调用当前方法,导致您的递归。进行强制转换时,被覆盖的版本是唯一适用的方法,因此您可以获得所需的行为。