我有一个类型为T
的泛型类。在这个课程中,我有一个方法,我需要将类型T
与另一个类型T
进行比较,例如:
public class MyClass<T>
{
public T MaxValue
{
// Implimentation for MaxValue
}
public T MyMethod(T argument)
{
if(argument > this.MaxValue)
{
// Then do something
}
}
}
MyMethod
内的比较操作失败,出现编译错误CS0019。是否可以向T
添加约束以使其工作?我尝试在类定义中添加where T: IComparable<T>
无效。
答案 0 :(得分:9)
添加约束以确保类型实现IComparable<T>
是一种方法。但是,您无法使用<
运算符 - 界面提供方法CompareTo
来执行相同的操作:
public class MyClass<T> where T : IComparable<T> {
public T MaxValue {
// Implimentation for MaxValue
}
public T MyMethod(T argument) {
if(argument.CompareTo(this.MaxValue) > 0){
// Then do something
}
}
}
如果您需要其他数字运算符而不仅仅是比较,则情况更加困难,因为您无法添加约束来支持示例+
运算符,并且没有相应的接口。关于此can be found here的一些想法。
答案 1 :(得分:3)
不,这是不可能的,遗憾的是,在c#中不允许运算符约束。
where T: IComparable<T>
应该工作得很好,但你必须使用其他语义:CompareTo方法而不是&gt;,&lt;和==运营商。
答案 2 :(得分:2)
您必须使用IComparable<T>
的{{1}}方法。
答案 3 :(得分:1)
实际上,你在这里不需要任何特别的东西。 Comparer<T>.Default
提供了一种.Compare
方法,可以执行您需要的所有操作,而不需要任何其他通用约束(这些约束可能会传播得非常严重)。它适用于IComparable<T>
和IComparable
,并支持类,结构和Nullable<T>
。完成工作。
有关信息,这是LINQ Max
/ Min
实现的工作方式,同样也是List<T>.Sort
。这是BCL的一个普遍且受到良好支持的部分。
答案 4 :(得分:0)
这不是直接可行的,但有解决方法。