2011-09-06 94 views
8

有一個基類有一個泛型類型的方法,我相信在我的派生類中我將返回一個字符串。這是我的代碼:類型參數聲明必須是不是類型的標識符

public abstract class Base 
    { 
     public virtual T GetSomething<T>() 
     { 
      return default(T); 
     } 
    } 

    public class Extended : Base 
    { 
     public override string GetSomething<string>() 
     { 
      return string.Empty; 

      //return base.GetSomething<T>(); 
     } 
    } 

但是這段代碼不能編譯。任何人都可以發現錯誤?我確信在擴展類中,我只想返回字符串。我該如何解決這個問題?

回答

8

你不能用一個具體的實現覆蓋泛型方法;這不是泛型的工作原理。例如Extended類必須能夠處理對GetSomething<int>()的調用。

換句話說,重寫方法的簽名必須是與其覆蓋的方法相同的。通過指定該方法的具體通用實現,您可以更改其簽名。

考慮使用這種方法:

public override T GetSomething<T>() 
{ 
    if (typeof(T) == typeof(string)) 
     return string.Empty; 

    return base.GetSomething<T>(); 
} 

注意,編譯該方法的具體實例時,JIT應當優化掉的條件。 (如果它不是,那麼它不是一個很好的JIT!)

(您的覆蓋的語法在技術上是正確的,但由於其他原因也是如此,例如,您不能使用關鍵字string作爲如果可以的話,你的代碼仍然不會做你想要的,也不會編譯,因爲編譯器將無法找到超類型上具有該簽名的方法。)

+2

或更改基本類聲明爲'public abstract class Base ' – Eranga

+0

也許,然後'擴展:基地'。這當然是可能的。目前還不清楚OP要完成什麼,因此我選擇了對類設計進行最小改動的方法。 – cdhowie

相關問題