c# - 具有可为空类型的泛型约束
问题描述
我有这些定义非常明确的方法,它们在内部都调用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
约束(尽管改变约束当然很好)。
解决方案
您需要两个单独的重载。一为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);
}
推荐阅读
- php - PHP,fopen() 无法从站点的根目录创建新文件
- asp.net - Recaptcha 停止在我的一半网站上工作?
- node.js - 从 github 克隆一个 electronjs 存储库并收到错误“找不到模块”
- java - 如果元素存在于不可编辑的页面中,则非常有用
- php - 使用 URL 掩码运行 URL 时找不到对象
- html - 添加文本意外地将容器向下推
- javascript - 从控制器 Spring 中的 js/ajax 获取 JSON 不起作用
- javascript - node.js多次插入行sql
- azure - Azure Active Directory 文件处理程序不会立即出现
- python - ValueError:X 每个样本有 57 个特征;期待 283 在使用 ML 的文本分类中