2011-02-01 23 views
2

ジェネリックメソッドを持つ非ジェネリックベースクラスがあります。メソッドの残りの部分を追加することでこのメソッドを拡張したいが、残りのメソッドはbaseあなたは基本法上のクラスの制約を持っているように、ここで例非ジェネリッククラスのジェネリックメソッドからジェネリックメソッドを派生

public override List<T> MyMethod<T>() 
{ 

// do some work in here 
... 
// 

return base.MyMethod<T>(); // **I get an error here saying that T must be a reference type** 
} 
+0

言語をタグとして指定することができます。 C#のように見えますが、私は肯定的ではありません。 – Pointy

+0

@pointy「override」キーワードがあるので、C#タグを追加しました... –

+0

それはC#です。ネット申し訳ありません、あなたたちは高速です。 – Ivan

答えて

1

に同じ制約を持っている必要があり、それがうまくコンパイル:

public class Base 
{ 
    // Base method has a 'class' constraint 
    public virtual List<T> MyMethod<T>() where T : class 
    { 
     return new List<T>(); 
    } 
} 

public class Derived : Base 
{ 
    // Override does not declare any constraints; constraints are inherited 
    public override List<T> MyMethod<T>() 
    { 
     // base call works just fine 
     return base.MyMethod<T>(); 
    } 
} 

あなたのエラーは、あなたが投稿したコードではありません。それは他のどこかにあるはずです。

+0

ありがとうTimwi、私の悪い(Javaのルーツ)VIRTUALは基本クラスのメソッドで指定されていません。 – Ivan

+0

ここでは、この制限を回避する方法を考えなければなりません。( – Ivan

+0

@Ivan:基本メソッドを仮想にするか、*できない場合には*別の名前(同じジェネリック型の制約) 。 – Timwi

5

.Method

は思えます。あなたはただ、私はこれを試してみましたオーバーライド

+0

はい、制約がありますが、制約が継承されるため自分自身を追加できません。 – Ivan

+1

@Ivan、オーバーライドで同じ制約を指定する必要があります。制約は暗黙的に継承されません。 – Vadim

+0

コンパイラは、オーバーライドの制約が基本メソッドから継承されていると不平を言っています。 – Ivan

関連する問題