重载方法中出现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 中测试
C#规范第7.3节规定:
首先,集合所有可访问(第3.5条(名为N的成员宣布在T和基本类型中(第节7.3.1(包含重写的声明修饰符从集合中排除如果不存在名为N的成员,并且可访问,则查找产生没有匹配,并且以下步骤是未评估。
由于这两个方法都适用,但其中一个方法被标记为重写,因此在确定调用哪个方法时会忽略它。因此,当前方法被调用,从而导致递归。进行强制转换时,重写的版本是唯一适用的方法,因此可以获得所需的行为。