where (ジェネリック型制約) (C# プログラミング ガイド)

更新 : 2007 年 11 月

ジェネリック型定義では、where 句は、ジェネリック宣言で定義されている型パラメータの引数として使用できる型に対する制約を指定します。たとえば、型パラメータ T が IComparable<T> インターフェイスを実装するように MyGenericClass ジェネリック クラスを宣言できます。

public class MyGenericClass<T> where T:IComparable { }
Bb384067.alert_note(ja-jp,VS.90).gifメモ :

クエリ式での 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# 言語仕様」の次のセクションを参照してください。

  • 19.1.4 制約

参照

概念

C# プログラミング ガイド

参照

ジェネリックの概要 (C# プログラミング ガイド)

new 制約 (C# リファレンス)

型パラメータの制約 (C# プログラミング ガイド)

その他の技術情報

C# リファレンス