重载方法中出现StackOverflow异常

本文关键字:StackOverflow 异常 方法 重载 | 更新日期: 2023-09-27 18:01:04

我正在尝试调用代码中的重载方法:

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 中测试

重载方法中出现StackOverflow异常

C#规范第7.3节规定:

首先,集合所有可访问(第3.5条(名为N的成员宣布在T和基本类型中(第节7.3.1(包含重写的声明修饰符从集合中排除如果不存在名为N的成员,并且可访问,则查找产生没有匹配,并且以下步骤是未评估。

由于这两个方法都适用,但其中一个方法被标记为重写,因此在确定调用哪个方法时会忽略它。因此,当前方法被调用,从而导致递归。进行强制转换时,重写的版本是唯一适用的方法,因此可以获得所需的行为。