5

基本上我有以下几点:

public static bool IsBetween<T>(this T value, T a, T b)
    where T : IComparable
{
    ...
}

public static bool IsBetween<T>(this T value, T a, T b)
    where T : IComparable<T>
{
    ...
}

问题是我不能这样做,因为即使约束不同,您也不能拥有具有相同签名的成员。但是,没有办法说明约束是IComparableOR IComparable<T>。所以,我不确定除了挑选一个并继续使用它之外还能做什么。而且,无论我选择哪一个,我都会输掉另一个,因为它们是分开的并且不会相互继承(这是有道理的)。

我是否在这里遗漏了一些东西,有一种方法可以同时使用两者,还是我必须选择一个(可能是通用版本)?

4

2 回答 2

8

我不明白为什么第一种方法是通用的。为什么不只是:

public static bool IsBetween(this IComparable value, IComparable left, IComparable right)

使方法泛型增加了什么价值?显然,您不会避免装箱惩罚,因为当您调用时值将被装箱CompareTo(object)

除非您有一些令人信服的理由使该方法通用,否则不要使其通用。然后它具有与其他方法不同的签名,您的问题就解决了。

于 2012-02-18T15:55:33.727 回答
3

在 .NET 中,方法解析重载不考虑返回类型和泛型约束。所以即使IComparableIComparable<T>有一些共同点仍然行不通。只选择IComparable<T>版本。Int32、Decimal、DateTime 等标准 .NET 类型无论如何都实现了这两个接口。

于 2012-02-18T13:02:17.933 回答