2

我試圖調用代碼重載的方法是這樣的:StackOverflowException在重載方法

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

回答

2

Section 7.3 of the C# spec規定:

首先,該組所有可訪問 (3.5節)名稱的成員氮T中聲明 和基本類型(第 7.3 T)的構造。 包含重寫 修飾符的聲明將從該組中排除。如果 沒有名爲N的成員並且可以訪問 ,則查找生成 不匹配,並且以下步驟是 未評估。

由於這兩種方法都適用,但其中一個標記爲覆蓋,爲了確定調用哪種方法,它將被忽略。因此,當前的方法被調用,導致你的遞歸。當您進行演員時,重寫的版本是唯一適用的方法,因此您可以獲得所需的行爲。

+0

Thans很多。人在終身學習 – user829823