別の汎用クラスのサブクラスになる制約を持つ汎用型の引数を持つクラスを作成したいとします。一般的な制約内の汎用型の引数
例:
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>>
私はインナー型引数の重複を避けるためにしたいです。これは可能ですか?
いいえ、 'TGeneric'はジェネリック型ではない型引数ですが、それは実現したいものです – Kenneth
' T'を最初に宣言することなくあなたが望むことをする方法はないと思います。汎用型の引数は、関数の引数のようなものです。それらを使用する前にそれらを宣言しなければなりません。 – Craxal