【问题标题】:Binary comparison operators on generic types泛型类型的二元比较运算符
【发布时间】:2011-02-03 02:08:06
【问题描述】:

我有一个泛型类,它采用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&lt;T&gt; 无济于事。

【问题讨论】:

  • 不可能 =( 。但是有一个开源数学库试图处理它,必须记住名字......

标签: c# .net generics


【解决方案1】:

其实,这里不需要什么特别的东西。 Comparer&lt;T&gt;.Default 提供了一个 .Compare 方法,它可以做你需要的一切,而不需要任何额外的通用约束(这往往会传播得非常可怕)。它适用于IComparable&lt;T&gt;IComparable,并支持类、结构和Nullable&lt;T&gt;。任务完成。

关于信息,这是 LINQ Max / Min 实现的工作方式,List&lt;T&gt;.Sort 也是如此。所以是 BCL 的一个常见且得到很好支持的部分。

【讨论】:

    【解决方案2】:

    添加约束以确保该类型实现IComparable&lt;T&gt; 是一种方法。但是,您不能使用 &lt; 运算符 - 接口提供了一个方法 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的一些想法。

    【讨论】:

    【解决方案3】:

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

    I posted mine in a different question here.

    【讨论】:

      【解决方案4】:

      你必须使用IComparable&lt;T&gt;CompareTo方法。

      【讨论】:

        【解决方案5】:

        不,这是不可能的,不幸的是,c# 中不允许使用运算符约束。 where T: IComparable&lt;T&gt; 应该可以正常工作,但您必须使用其他语义:CompareTo 方法而不是 >、

        【讨论】:

        • 是的,我不确定 OP 是否与为此使用运算符结合。
        • 嗯..我不太明白你的评论。
        • 他的意思是 OP 没有义务使用这些运算符。他可以使用任何其他方式,只要它有效。
        猜你喜欢
        • 2014-02-23
        • 2016-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        相关资源
        最近更新 更多