我想创建一个适用于所有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)
答案 0 :(得分:11)
所有派生的泛型类也必须实现泛型约束。
因此,您应该将该类声明为:
public class InsertionSort<T> : SortAlgorithm<T> where T : System.IComparable<T>
错误基本上是说泛型参数T
(此时可以是任何类或结构)不能保证实现IComparable<T>
,因为基类限制SortAlgorithm
{1}}界面)。
如上所述,您也可以通过在InsertionSort
类上指定约束来提供此保证。