首页 > 解决方案 > 具有可为空类型的泛型约束

问题描述

我有这些定义非常明确的方法,它们在内部都调用InternalGreaterThan()但无法找到一种方法——在不消除T约束的情况下——使其适用于long?DataTime?

#nullable enable
public static bool GreaterThan(long? @this, long? value)
{
    return InternalGreaterThan(@this, value);
}

public static bool GreaterThan(DateTime? @this, DateTime? value)
{
    return InternalGreaterThan(@this, value);
}

public static bool GreaterThan(Version? @this, Version? value)
{
    return InternalGreaterThan(@this, value);
}

private static bool InternalGreaterThan<T>(T @this, T value) where T : IComparable<T>?
{
    return @this != null && value != null && Comparer<T>.Default.Compare(@this, value) > 0;
}

我在这里有什么选择而不必删除T约束(尽管改变约束当然很好)。

标签: c#.net

解决方案


您需要两个单独的重载。一为T一为T?。例如:

private static bool InternalGreaterThan<T>(T @this, T value) where T : IComparable<T>
{
    return Comparer<T>.Default.Compare(@this, value) > 0;
}

private static bool InternalGreaterThan<T>(T? @this, T? value) where T : struct, IComparable<T>
{
    return @this.HasValue && value.HasValue && InternalGreaterThan(@this.Value, value.Value);
}

推荐阅读