【问题标题】:C# using Generics both in the Interface and its implementor classC# 在接口及其实现类中使用泛型
【发布时间】:2012-10-24 13:27:15
【问题描述】:

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

【问题讨论】:

    标签: c# generics interface


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 不会使用T : IComparable&lt;T&gt; 造成一些问题?不应该是T : IComparable&lt;U&gt;吗?
    • @LightStriker 不,我认为这没有任何问题。
    • @wOlf: T 是 IComparable... 所以 T 是 IComparable>?
    • @LightStriker 类T 实现IComparable&lt;T&gt; 并不罕见。所做的只是实现一个int CompareTo(T other) 方法。
    • @LightStriker Here 是一个更长的解释,而不是我试图在评论中加入一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2010-11-14
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多