where (ジェネリック型制約) (C# リファレンス)
ジェネリック型定義では、where 句は、ジェネリック宣言で定義されている型パラメーターの引数として使用できる型に対する制約を指定します。たとえば、型パラメーター T が IComparable<T> インターフェイスを実装するように MyGenericClass ジェネリック クラスを宣言できます。
public class MyGenericClass<T> where T:IComparable { }
[!メモ]
クエリ式での where 句の詳細については、「where 句 (C# リファレンス)」を参照してください。
where 句には、インターフェイス制約だけでなく基本クラス制約も指定できます。基本クラス制約は、ジェネリック型の型引数として使用する型には、基本クラスとして指定されているクラスまたは基本クラス自体が含まれている必要があることを指定します。このような制約を使用する場合は、型パラメーターに関する制約よりも前に制約を記述する必要があります。
class MyClass<T, U>
where T : class
where U : struct
{ }
where 句には、コンストラクター制約も指定できます。新しい演算子を使用して型パラメーターのインスタンスを作成できますが、このようにインスタンスを作成するには、コンストラクター制約 new() によって型パラメーターに制約を指定する必要があります。new() 制約に基づいて、コンパイラは、指定されている型引数には、アクセス可能なパラメーターなしの (または既定の) コンストラクターが必要であることを認識します。次に例を示します。
public class MyGenericClass<T> where T : IComparable, new()
{
// The following line is not possible without new() constraint:
T item = new T();
}
new() 制約は、where 句の最後に記述します。
複数の型パラメーターがある場合には、型パラメーターごとに where 句を 1 つずつ使用します。次に例を示します。
interface IMyInterface
{
}
class Dictionary<TKey, TVal>
where TKey : IComparable, IEnumerable
where TVal : IMyInterface
{
public void Add(TKey key, TVal val)
{
}
}
次に示すように、ジェネリック メソッドの型パラメーターにも制約を適用できます。
public bool MyMethod<T>(T t) where T : IMyInterface { }
デリゲートに対する型パラメーター制約の構文は、メソッドの構文と同じである点に注意してください。
delegate T MyDelegate<T>() where T : new()
ジェネリック デリゲートについては、「汎用デリゲート (C# プログラミング ガイド)」を参照してください。
制約の構文と使い方の詳細については、「型パラメーターの制約 (C# プログラミング ガイド)」を参照してください。
C# 言語仕様
詳細については、「C# 言語仕様」を参照してください。言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。