gpt4 book ai didi

c# - 重载方法中的 StackOverflowException

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:58 25 4
gpt4 key购买 nike

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

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) .

但是当我使用 Actor 时:

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

一切正常。我错过了什么吗?或者这是 .NET 中的错误?在 .NET 2.0、3.5、4.0 中测试

最佳答案

Section 7.3 of the C# spec状态:

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.

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

关于c# - 重载方法中的 StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6584274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com