我正试图在这样的代码中调用重载方法:
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中测试
答案 0 :(得分:2)
首先,所有可访问的集合 (第3.5节)名为N的成员声明 在T和基础类型(部分 构建了T的7.3.1)。 包含覆盖的声明 修饰符从集合中排除。如果 没有名为N的成员存在且是 可访问,然后查找产生 不匹配,以下步骤 没有评估。
由于两种方法都适用,但其中一种方法被标记为覆盖,因此为了确定调用哪种方法,将忽略它。因此,调用当前方法,导致您的递归。进行强制转换时,被覆盖的版本是唯一适用的方法,因此您可以获得所需的行为。