IComparer <t>和泛型类型方法问题

时间:2016-04-23 21:02:00

标签: c# generics

这是问题,我必须编写泛型类型的方法,并且只能由处理IComparer接口的类型使用,另外我的方法需要将T数组和IComparer作为参数。方法应从IComparer指定的条件返回最大值。我已经编写了测试类,其中包含IComparable和IComparer的基本实现(下面的代码)。

public class TestClass : IComparable<TestClass>
{
    public int CompareTo(TestClass other)
    {
        throw new NotImplementedException();
    }


}
public class Nested : IComparer<TestClass>
{
    IComparer<TestClass> criteria;

    public int Compare(TestClass x, TestClass y)
    {
        throw new NotImplementedException();
    }
}


static void Main(string[] args)
    {
        Nested x = new Nested();
        TestClass[] tab = { new TestClass() };
        Tools.ElementsMax<TestClass>(tab, x);

    }

当我尝试测试方法时,我收到此错误:

  

Blockquote错误CS0311类型&#39; x.TestClass&#39;不能用作类型参数&#39; T&#39;在通用类型或方法&#39; Tools.ElementsMax(T [],IComparer)&#39;。没有来自&#39; x.TestClass&#39;的隐式参考转换。 to&#39; System.Collections.Generic.IComparer&#39;。

我不明白为什么我会收到这个错误,我确信它应该以这种方式运作,但令人惊讶的是它没有。

1 个答案:

答案 0 :(得分:1)

  

我必须编写泛型类型的方法,并且只能由处理IComparer接口的类型使用,此外我的方法需要将T数组和IComparer作为参数

您可能意味着“哪个句柄IComparable界面”,而不是IComparer。从您的错误消息中可以看出,您的ElementsMax方法的编码方式与您用英语描述的方式完全相同,即

public static T ElementsMax<T>(T[] data, IComparer<T> c) where T : IComparer<T>
//                                                                 ^^^^^^^^^^^^

然而,这是不正确的:您应该将T约束为IComparable<T>

public static T ElementsMax<T>(T[] data, IComparer<T> c) where T : IComparable<T>
//                                                                 ^^^^^^^^^^^^^^