C铉汎型のパラメータ制約について詳細に説明する。


一般的な制約
制約は、コンパイラタイプのパラメータが必要な機能を教えます。任意の制約がない場合、タイプパラメータは任意のタイプであってもよい。コンパイラはSystem.Objectのメンバーしか仮定できません。NETタイプの最終ベースクラスです。クライアントコードが制約を満たしていないタイプを使用している場合、コンパイラはエラーを送信します。whereコンテキストキーを使用して制約を指定します。下表には7つのタイプの制約があります。
制約
説明
where T:struct
タイプパラメータは、nullではない値タイプでなければなりません。nullの値の種類については、nullの値の種類を参照してください。すべての値タイプがアクセス可能な無パラメータ構造関数を持つので,struct制約はnew()制約を表し,new()制約と結合して使用できない。struct制約もunmanage制約と結合して使用することができません。
where T:クラス
タイプのパラメータは参照タイプでなければなりません。この制約は、任意のクラス、インターフェース、委託または配列タイプにも適用されます。C铉8.0またはより高いバージョンのnullコンテキストでは、Tはnullであってはいけない参照タイプである必要がある。
where T:クラス
タイプパラメータは、nullまたはnullではなくてもよい参照タイプでなければなりません。この制約は、任意のクラス、インターフェース、委託または配列タイプにも適用されます。
where T:notnull
タイプパラメータは、nullとしてはいけないタイプでなければなりません。パラメータは、C((zhi)8.0またはより高いバージョンのnullとしてはいけない参照タイプであってもよく、nullとしてはいけない値タイプであってもよい。
where T:unmanage d
タイプパラメータは、nullとしてはいけない非ホストタイプでなければなりません。unmanage制約は、struct制約を表し、struct制約またはnew()制約と結合して使用することができない。
where T:new()
タイプパラメータは、共通の無パラメータ構造関数を持つ必要があります。他の制約と一緒に使用する場合、new()制約は最後に指定しなければなりません。new()制約はstructとunmanage制約と結合して使用できない。
where T:
タイプパラメータは、指定されたベースクラスまたは指定されたベースクラスから派生する必要があります。C((zhi)8.0およびより高いバージョンのnullコンテキストでは、Tは、指定されたベースクラスから派生されたnullとは言えない参照タイプでなければならない。
where T:
タイプパラメータは、指定されたベースクラスまたは指定されたベースクラスから派生する必要があります。C((zhi)8.0およびより高いバージョンでは、nullコンテキストとすることができ、Tは、指定されたベースクラスから派生されたnullまたはnullとすることができるタイプとすることができる。
where T:
タイプパラメータは指定されたインターフェースまたは指定されたインターフェースを実装する必要があります。複数のインターフェース制約を指定できます。拘束インターフェースは汎型であってもよい。C铉8.0およびより高いバージョンのnullコンテキストでは、Tは指定されたインターフェースを実現するためのnullであってはならないタイプである必要がある。
where T:
タイプパラメータは指定されたインターフェースまたは指定されたインターフェースを実装する必要があります。複数のインターフェース制約を指定できます。拘束インターフェースは汎型であってもよい。C((zhi)8.0におけるnullコンテキストでは、Tはnullであり得る参照タイプ、nullではない参照タイプ、または値タイプであってもよい。Tはnullの値タイプではありません。
where T:U
Tのために提供されるタイプのパラメータは、Uに提供されるパラメータまたはUから派生されるパラメータでなければならない。nullであることができるコンテキストでは、Uがnullであってはいけない参照タイプである場合、Tはnullであってはいけない参照タイプである必要がある。Uがnullであり得る参照タイプである場合、Tはnullであり得る参照タイプであってもよく、nullではない参照タイプであってもよい。
最も一般的な汎型制約はwhere T:struct、where T:class、where T:new()です。
制約された複数のパラメータ
複数のパラメータに対して複数の制約を適用し、一つのパラメータに複数の制約を適用して、次の例に示す。

class Base { }
class Test<T, U>
  where U : struct
  where T : Base, new()
{ }
タイプのパラメータに==と!=演算子
where T:class制約を適用する場合は、タイプパラメータの使用を避けてください。演算子コンパイラは、Tがコンパイル時に参照の種類であることを知っています。すべての参照の種類に対して有効なデフォルトの演算子を使用しなければなりません。
値の等しい性をテストしなければならないならないならば、同時にwhere Tを適用することを提案します。IEquableまたはwhere T:IComparable制約は、汎型クラスを構成するために使用される任意のクラスで実装されます。
参考文献
タイプのパラメータの制約(C〓のプログラミングガイド)―Microsoft
以上はCタイプのパラメータ制約の詳細な内容を詳しく説明しました。Cタイプのパラメータ制約に関する資料は他の関連記事に注目してください。