如何在具有多个约束的C#中实现泛型方法

时间:2014-01-15 13:55:33

标签: c# generics

我想写一个通用的方法:

void Foo<T>(IList<T> list)

在该方法中,我想通过使用运算符&lt;来比较列表的元素。如果T是基本类型,或者如果T实现IComparable则为Compare()。

这可能吗?如果没有,这意味着我认为C#泛型的使用非常有限。

1 个答案:

答案 0 :(得分:15)

  

这可能吗?如果没有,这意味着我认为C#泛型的使用非常有限。

即使不可能,也可以在许多许多情况下使用泛型。

然而,鉴于所有原始类型都实现IComparable<T>;

,它非常简单
void Foo<T>(IList<T> list) where T : IComparable<T>
{
    T x = ...;
    T y = ...;
    if (x.CompareTo(y) < 0)
    {
        ...
    }
}

请注意,这将引入装箱操作。我希望原始类型的JITted代码最终具有非常类似的性能,可以使用<>进行硬编码。

现在这是一个稍微特殊的情况,因为有一个接口大致相当于那些运算符。使用算术运算符(+-等)不是很容易。有关此方法,请参阅article on my web site