如何"泛化"这种扩展方法?

Ang*_*ker 0 c# generics extension-methods c#-3.0

我有以下方法,目前适用于int?变量.我想将它扩展到任何数字可空变量(例如十进制?,双?等等...)

public static bool IsNullOrInvalid(this System.Nullable<int> source)
{
    return (source == null || source == -1);
}
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Jon*_*eet 8

棘手的一点就是找出每种情况下"无效"的含义.如果"任何被认为低于数据类型的默认值的值"是可以的,您可以尝试:

public static bool IsNullOrNegative<T>(this T? source)
    where T : struct, IComparable<T>
{
    return source == null || source.Value.CompareTo(default(T)) < 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:如评论中所述,没有"数字"约束 - 在每个与自身相当的值类型上调用此方法是有效的,例如DateTime.没有办法避免这种情况 - 添加更多约束可能会略微降低设置,但不会完全降低.

至于与-1完全比较,你需要能够为每种类型计算出值"-1".没有通用的方法.您可以为我感兴趣的每种类型手动构建Dictionary<Type, object>"-1",但这将非常难看.

如果-1无效,-2真的有效吗?这对我来说似乎很奇怪.