2012-04-19 10 views
1

私は、次のクラスとメソッドを持っている:ジェネリッククラスのwhere節内でジェネリッククラスを指定する方法は?

public class MyGenericClass<T> 
    where T : class 
{ 
} 

public class MyClass 
{ 
    public TGen MyMethod<TGen>(TGen myGenClass) 
     where TGen : MyGenericClass<T> 
     where T : class 
    { 
     return myGenClass; 
    } 
} 

それはMyMethodはでシンボルTを解決することはできませんので、しかし、これはエラーになります。私は少し冗長だと思われるので、MyMethod<TGen, T>を持っている必要はありません。これは可能ですか?

public TGen MyMethod<TGen, T>(TGen myGenClass) 
    where TGen : MyGenericClass<T> 
    where T : class 
{ 
    return myGenClass; 
} 
+2

しかし、 'MyMethod'には' T'型のパラメータはありません。私はあなたがしようとしていることを理解していません。 –

+0

私は 'public TGen MyMethod (TGen myGenClass)のようなものを持っています。TGen:MyGenericClass <>' – cm007

+0

また、私はあなたが 'MyGenericClass <>'で伝えようとしていることを理解していません。なぜMyGenericClassの型パラメータがどのように推測されると思いますか?何に推論? –

答えて

2

、その後、あなたが作成する必要があります使用するMyGenericClass実装の基本クラス(もちろん、これはあなたのTGenインスタンスに対してどのような機能が得られるかを制限します)。

public class MyGenericClassBase { } 
public class MyGenericClass<T> : MyGenericClassBase { } 
public class MyClass<TGen> 
     where TGen: MyGenericClassBase 
{ 
    // Stuff 
} 
1

はあなただけの方法のための一般的な種類のリストにTを含めることを忘れているように聞こえます。コンパイラがTの内容を知る方法はありません。

あなたは(MyClassと以下のようにメソッドレベルで、または、おそらくクラスレベルで)それを使用する前に、あなたがTを指定する必要があります。

public class MyClass 
{ 
    public TGen MyMethod<TGen, T>(TGen myGenClass) 
     where TGen : MyGenericClass<T> 
     where T : class 
    { 
     return myGenClass; 
    } 
} 

あなたはまた、どこにジェネリック型の具体的な実装を使用することができます句:あなたはTGenタイプの任意のMyGenericClass実装を使用することができるようにしたい場合は

public class MyClass 
{ 
    public TGen MyMethod<TGen>(TGen myGenClass) 
     where TGen : MyGenericClass<DateTime> 
    { 
     return myGenClass; 
    } 
} 
3

あなたは定義の中でそれを使用することができます前に、Tを指定する必要があります。

関連する問題