2

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

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

4

1 回答 1

2

C# 规范的第 7.3 节指出:

首先,构造在 T 中声明的所有可访问(第 3.5 节)成员 N 和 T 的基本类型(第 7.3.1 节)的集合。包含覆盖修饰符的声明被排除在集合之外。如果不存在名为 N 且可访问的成员,则查找不生成匹配项,并且不评估以下步骤。

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

于 2011-07-05T14:33:26.117 回答