重载方法中的 StackOverflowException

发布于 2024-11-18 16:27:22 字数 1097 浏览 2 评论 0原文

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

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(BaseClassother) 而不是 Method(ChildClass other) )

但是当我使用演员表时:

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

一切都按预期进行。 我错过了什么吗?或者这是 .NET 中的一个错误? 在.NET 2.0、3.5、4.0中测试

I'm trying to call overloaded method in code like this:

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();
    }
}

Everything looks ok, but the StackOverflowException is thrown.
In my understanding if i call overloaded method, then the most specific method version should be called, but in this case the Method(BaseClass<ChildClass> other) is called instead of Method(ChildClass other).

But when i use a cast:

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

everything works as expected.
Am i missing somethig? Or this is a bug in .NET?
Tested in .NET 2.0,3.5,4.0

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

白色秋天 2024-11-25 16:27:22

C# 规范第 7.3 节 指出:

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

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

Section 7.3 of the C# spec states:

First, the set of all accessible
(Section 3.5) members named N declared
in T and the base types (Section
7.3.1) of T is constructed. Declarations that include an override
modifier are excluded from the set.
If
no members named N exist and are
accessible, then the lookup produces
no match, and the following steps are
not evaluated.

Since both methods are applicable, but one of them is marked as override, it is ignored for the purposes of determining which method to call. Thus the current method is invoked, leading to your recursion. When you make the cast, the overridden version is the only applicable method, and so you get the desired behaviour.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文