C#在接口及其实现者类中使用泛型

时间:2012-11-04 15:11:54

标签: c# generics interface

我想创建一个适用于所有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)

1 个答案:

答案 0 :(得分:11)

所有派生的泛型类也必须实现泛型约束。

因此,您应该将该类声明为:

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

错误基本上是说泛型参数T(此时可以是任何类或结构)不能保证实现IComparable<T>,因为基类限制SortAlgorithm {1}}界面)。

如上所述,您也可以通过在InsertionSort类上指定约束来提供此保证。