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

Fur*_*kan 3 c# generics interface

我想创建一个适用于所有IComparable类型的接口.例如

public interface SortAlgorithm<T> where T : System.IComparable<T>
{
    List<T> Sort(List<T> input);
}
Run Code Online (Sandbox Code Playgroud)

我希望它的实现者也是通用的,并且我在界面中提供了相同的规范.像下面的例子

public class InsertionSort<T> : SortAlgorithm<T>
Run Code Online (Sandbox Code Playgroud)

这是我这样做的目的.我希望我的所有排序算法都适用于实现IComparable接口的所有类型.并且希望在接口中提供T是IComparable的子类的规范.但是当我这样做时,我得到以下错误.

错误1类型'T'不能用作泛型类型或方法'Algorithms.SortingAlgorithm.SortAlgorithm'中的类型参数'T'.从'T'到'System.IComparable'没有装箱转换或类型参数转换.

我不明白这个的原因.我可以实现一个通用接口,并使其实现者类也是通用的,但是当在接口中给出规范时,我不能这样做(其中T:System.IComparable)

Cri*_*scu 11

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

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

public class InsertionSort<T> : SortAlgorithm<T> where T : System.IComparable<T>
Run Code Online (Sandbox Code Playgroud)

错误基本上说的是泛型参数T(此时可以是任何类或结构)不能保证实现IComparable<T>,因为基类(SortAlgorithm接口)约束.

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

  • @LightStriker [这里](http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx)是一个稍长的解释,而不是我试图适应某些东西一条评论. (2认同)