我想写一个通用的方法:
void Foo<T>(IList<T> list)
在该方法中,我想通过使用运算符&lt;来比较列表的元素。如果T是基本类型,或者如果T实现IComparable则为Compare()。
这可能吗?如果没有,这意味着我认为C#泛型的使用非常有限。
答案 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。