.NET でのジェネリック インターフェイス

この記事では、ジェネリック型のファミリ間に共通する機能を提供する .NET のジェネリック インターフェイスについて概説します。

ジェネリック インターフェイスは、順序付け比較や等価比較、およびジェネリック コレクション型で共有される機能のために、非ジェネリック インターフェイスに対応するタイプ セーフな機能を提供します。 .NET 7 では、System.Numerics.INumber<TSelf> のように、数値に似た型のためにジェネリック インターフェイスが導入されています。 このインターフェイスでは、数学的機能を提供するジェネリック メソッドを定義できます。ジェネリック型のパラメーターは、ジェネリックな数値インターフェイスを実装する型に制限されます。

Note

いくつかのジェネリック インターフェイスの型パラメーターが共変または反変としてマークされ、それらのインターフェイスを実装する型をより柔軟に割り当てたり使用したりできます。 詳細については、「共変性と反変性」を参照してください。

等価比較と順序付け比較

  • System 名前空間で、System.IComparable<T>System.IEquatable<T> ジェネリック インターフェイスは、対応する非ジェネリック インターフェイスと同じように、順序付け比較と等価比較の方法をそれぞれ定義します。 型は、そのような比較の実施能力を提供するために、これらのインターフェイスを実装します。

  • System.Collections.Generic 名前空間では、IComparer<T>IEqualityComparer<T> のジェネリック インターフェイスによって System.IComparable<T> または System.IEquatable<T> のインターフェイスを実装しない型の順序付け比較または等価比較を定義することができます。 また、このような型のリレーションシップを再定義する方法も提供されています。

    これらのインターフェイスは、多くのジェネリック コレクション クラスのメソッドやコンストラクターで使用されます。 たとえば、ジェネリック IComparer<T> オブジェクトを SortedDictionary<TKey,TValue> クラスのコンストラクターに渡して、ジェネリック System.IComparable<T> を実装しない型の並べ替え順序を指定することができます。 ジェネリック IComparer<T> 実装を使用して配列やリストを並べ替えるための、Array.Sort ジェネリック静的メソッドと List<T>.Sort インスタンス メソッドのオーバーロードがあります。

    Comparer<T> および EqualityComparer<T> ジェネリック クラスは、IComparer<T> および IEqualityComparer<T> ジェネリック インターフェイスの実装のための基底クラスを提供し、それぞれの Comparer<T>.Default および EqualityComparer<T>.Default プロパティによって既定の順序付け比較と等価比較も提供します。

コレクションの機能

  • ICollection<T> ジェネリック インターフェイスは、ジェネリック コレクション型の基本インターフェイスです。 これは、要素を追加、削除、コピー、および列挙するための基本的な機能を提供します。 ICollection<T> は、ジェネリック IEnumerable<T> と非ジェネリック IEnumerable の両方から継承します。

  • IList<T> ジェネリック インターフェイスは、インデックス付きの取得のための手段により、ICollection<T> ジェネリック インターフェイスが機能拡張されたものです。

  • IDictionary<TKey,TValue> ジェネリック インターフェイスは、キー付きの取得のための手段により、ICollection<T> ジェネリック インターフェイスが機能拡張されたものです。 .NET の基本クラス ライブラリのジェネリック ディクショナリ型は、非ジェネリック IDictionary インターフェイスも実装します。

  • IEnumerable<T> ジェネリック インターフェイスは、ジェネリック列挙子の構造体を提供します。 ジェネリック列挙子によって実装される IEnumerator<T> ジェネリック インターフェイスは、非ジェネリック IEnumerator インターフェイスを継承します。型パラメーター T に依存しない MoveNext および Reset メンバーは、非ジェネリック インターフェイスにのみ表示されます。 つまり、非ジェネリック インターフェイスのコンシューマーはすべて、ジェネリック インターフェイスも使用できます。

数学関数

.NET 7 では、数値に似た型とそれに使用できる機能を記述するジェネリック インターフェイスが System.Numerics 名前空間に導入されています。 Int32Double など、.NET 基本クラス ライブラリから提供される 20 個の数値型はこれらのインターフェイスを実装するように更新されています。 これらのインターフェイスの中で最も重要なのが INumber<TSelf>です。これは "実数" にほぼ対応します。

これらのインターフェイスの詳細については、「ジェネリック型数値演算」を参照してください。

関連項目