2016-08-19 6 views
0

別の汎用クラスのサブクラスになる制約を持つ汎用型の引数を持つクラスを作成したいとします。一般的な制約内の汎用型の引数

例:

public class SomeGeneric<T> where T : new() 
{ 
    T CreateItem() => new T(); 
} 

このクラス私が作成したいです。注意:私は、このクラスのクライアントが二倍インナー型引数を指定しない:

public class TheClass<TGeneric> where TGeneric : SomeGeneric<T>, new() 
{ 
    public T Item {get; private set;} 
    public void TheClass 
    { 
     var instance = new TGeneric(); // this is possible because of the new() restriction 
     Item = instance.CreateItem(); 
    } 
} 

次のようにこれは、その後、使用することができます

class AnotherClass 
{ 

} 

class Client : TheClass<SomeGeneric<AnotherClass>> 
{ 
    public void SomeMethod() 
    { 
     var theInstanceOfAnotherClass = this.Item; 
     // Do stuff with it 
    } 
} 

私の知る限り、これではありません

public class TheClass<TGeneric> where TGeneric : SomeGeneric<T>, new() 

回避策は次のように行うには、次のようになります:

それは Tが知られていないことを、この行に文句を言うので、可能
public class TheClass<T, TGeneric> where TGeneric : SomeGeneric<T>, new() 

しかし、それは、クライアントがこれを行う必要があることを意味します:

public class Client : TheClass<AnotherClass, SomeGeneric<AnotherClass>> 

私はインナー型引数の重複を避けるためにしたいです。これは可能ですか?

答えて

-1

これは機能しますか、それとも似ていますか?

public SomeClass<TGeneric<T>> where TGeneric<T> : SomeGeneric<T> 
+0

いいえ、 'TGeneric'はジェネリック型ではない型引数ですが、それは実現したいものです – Kenneth

+0

' T'を最初に宣言することなくあなたが望むことをする方法はないと思います。汎用型の引数は、関数の引数のようなものです。それらを使用する前にそれらを宣言しなければなりません。 – Craxal

0

私はこれが可能ではないと思います。 This questionは同じ状況に対処します。

MSDNのこの吹き出しには、C++とは異なり、許可されていないと書かれています。この制限の理由があるかどうかはわかりません。

C#では、ジェネリック型はジェネリック型として使用できますが、ジェネリック型のパラメータ自体は汎用ではありません。 C++はテンプレートパラメータを許可します。

一般的なobjectを使用するには、何らかの方法でクラスを修正する必要があります。そうでない場合は、重複する型引数を使用してください。

関連する問題