c# - 单个泛型的 Comparable 和 Nullable 约束

标签 c# generics extension-methods nullable

我想编写一个扩展方法,将一个值与另外两个值进行比较,并确定该值是否在另外两个值之内。这适用于此目的

public static bool IsWithin<T>(this T value, T min, T max) where T : IComparable<T>
{
    return (bool)(value.CompareTo(min) > 0 && value.CompareTo(max) < 0);
}

我还想扩展此方法以处理 Nullable<T> .如果值为空,我希望忽略任何一个边界条件。我曾尝试对 T 施加额外的约束,但这不受支持。以下代码无法编译,但这是我想要实现的。

public static bool IsWithinInclusive<T>(this T value, Nullable<T> min, Nullable<T> max) where T : IComparable<T>
{
    return (bool)(
        (min.HasValue ? value.CompareTo(min) >= 0 : true) && 
        (max.HasValue ? value.CompareTo(max) <= 0 : true));
}

是否可以编写一个实现此目的的方法?

最佳答案

你需要约束T成为struct匹配 definition of Nullable<T> :

public static bool IsWithinInclusive<T>(this T value, Nullable<T> min, Nullable<T> max) where T : struct, IComparable<T>
{
    return 
        (min.HasValue ? value.CompareTo(min.Value) >= 0 : true) && 
        (max.HasValue ? value.CompareTo(max.Value) <= 0 : true);
}

您还需要使用 .Value得到T来自 Nullable<T> .

关于c# - 单个泛型的 Comparable 和 Nullable 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29661603/

相关文章:

c# - 在这两种链式扩展方法中,是否有理由优先使用其中一种?

swift - 在 swift 3 中使用扩展时使用未解析的标识符

c# - 如何在 C# 中将 IEnumerable 转换为自定义类型?

c# - 蓝牙文件发送

c# - ASP.NET 服务器端 View 状态

c# - AssemblyInformation 中的应用名称

c# - 如何通过反射获取类及其父类的私有(private)字段?

java - 从泛型 ArrayList 派生泛型类型

javascript - T 将 String 扩展为映射类型的索引

generics - 问号在类型参数绑定(bind)中意味着什么?