泛型类型的二元比较运算符

时间:2010-03-31 19:13:10

标签: c# .net generics

我有一个类型为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>无效。

5 个答案:

答案 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)

这不是直接可行的,但有解决方法。

I posted mine in a different question here.