2011-09-06 2 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>()への呼び出しを処理できる必要があります。

つまり、オーバーライドするメソッドのシグネチャは、オーバーライドするメソッドにと同じと一致する必要があります。メソッドの具体的な汎用実装を指定することによって、そのシグネチャを変更します。

は、このアプローチの使用を検討してください。この方法の特定のインスタンスをコンパイルするときにJIT条件を離れて最適化する必要があることを

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

    return base.GetSomething<T>(); 
} 

注意。 (そうでなければ、それは非常に良いJITではありません)

(あなたの上書きの構文は技術的には正しいですが、他の理由でも失敗します)たとえば、stringをaとして使用することはできませんコンパイラがスーパータイプでそのシグネチャを持つメソッドを見つけることができないため、コンパイラはスーパータイプでメソッドを見つけることができないため、コンパイルすることはできません)。

+2

またはベースを変更します'public abstract class Base ' – Eranga

+0

にクラス宣言した後、 'Extended:Base 'とします。それは確かに可能です。 OPが何を達成しようとしているかはすぐに分かりませんので、私はクラスデザインに最小限の変更を加えるだけのアプローチを選択しました。 – cdhowie

関連する問題