ジェネリック型パラメーターは識別子として指定する必要があります。制約はより複雑な入れ子式を使用する場合がありますが、パラメーター自体は使用してはなりません。何らかの type のパラメーターを取る汎用メソッドが必要な場合は、次のNullable<T>
ように指定しません。
void ThisWontWork<Nullable<T>>(T it) where T:struct {...}
しかし代わりに:
void ThisWillWork<T>(Nullable<T> it) where T:struct {...}
コレクションが、すべて 1 つの型である、さらに修飾された一般的なものを保持している可能性がある場合は、その型をコレクションの型パラメーターとして追加することをお勧めします。
class ListOfLists<T,U> where T:IList<U>
コレクションがさまざまなジェネリック型を持つジェネリック インターフェイスを実装するものを保持しているが、そのような型を含まないメンバーのみを使用する必要がある場合は、可能であれば、ジェネリック型は独自のインターフェイスに分離され、完全なジェネリックによって継承される可能性があります。たとえば、Microsoft はIDictionary
このように設計していませんが、次のように定義できた可能性があります (一部:)
interface ICheckIfContained
{ bool Contains(object it); }
interface ICheckIfContained<in T> : ICheckIfContained
{ bool Contains(T it); }
interface IDictionary<in TKey, out TValue> : ICheckIfContained<TKey> ...
ディクショナリへの参照のコレクションを保持したい場合は、ディクショナリ内のキーをスキャンするためだけに、それらのキーが何にマップされるかに関係なく、制約されたジェネリック パラメータICheckIfContained
がそのような目的に役立ちます。