3

すべてのIComparableタイプで機能するインターフェイスを作成したいと思います。例えば

public interface SortAlgorithm<T> where T : System.IComparable<T>
{
    List<T> Sort(List<T> input);
}

そして、その実装者も、インターフェースで提供するのと同じ仕様で汎用的にする必要があります。以下の例のように

public class InsertionSort<T> : SortAlgorithm<T>

これを行う私の目的は次のとおりです。すべての並べ替えアルゴリズムを、IComparableインターフェイスを実装するすべてのタイプで機能させたいです。そして、Tがインターフェイスで一度IComparableのサブクラスであるという仕様を提供したいと思います。しかし、これを行うと、次のエラーが発生します。

エラー1タイプ'T'は、ジェネリック型またはメソッド'Algorithms.SortingAlgorithm.SortAlgorithm'のタイプパラメーター'T'として使用できません。'T'から'System.IComparable'へのボクシング変換またはタイプパラメータ変換はありません。

その理由がわかりませんでした。ジェネリックインターフェイスを実装し、その実装クラスをジェネリックにすることもできますが、インターフェイスで仕様を指定する場合は同じことはできません(T:System.IComparable)

4

1 に答える 1

11

派生したすべてのジェネリッククラスも、ジェネリック制約を実装する必要があります。

したがって、クラスを次のように宣言する必要があります。

public class InsertionSort<T> : SortAlgorithm<T> where T : System.IComparable<T>

エラーが基本的に言っているのは、基本クラス(インターフェース)によって制約されているため、ジェネリックパラメーターT(この時点では任意のクラスまたは構造体である可能性があります)の実装が保証されていないということです。IComparable<T>SortAlgorithm

InsertionSort上記のように、クラスにも制約を指定することで、この保証を提供できます。

于 2012-11-04T15:15:33.890 に答える