这是问题,我必须编写泛型类型的方法,并且只能由处理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;。
我不明白为什么我会收到这个错误,我确信它应该以这种方式运作,但令人惊讶的是它没有。
答案 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>
// ^^^^^^^^^^^^^^