Jas*_*ink 3 c# generics nullable iequalitycomparer
我想为Nullable结构编写一个相等比较器.让我们说,DateTime?.所以我想出了这个代码:
public class NullableEntityComparer<TEntity, TType> : IEqualityComparer<TEntity>
where TType : struct
where TEntity : Nullable<TType>
{
public bool Equals(TEntity x, TEntity y)
{
if(!x.HasValue && ! y.HasValue) return true;
if(x.HasValue && y.HasValue) return x.Value == y.Value;
return false;
}
public int GetHashCode(TEntity obj)
{
if (obj == null) throw new ArgumentNullException("obj");
if (obj.HasValue) return obj.Value.GetHashCode();
else return obj.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
编译器不喜欢这个并告诉我:
'TType?' is not a valid constraint. A type used as a constraint must be an interface, a non-sealed class or a type parameter.
Run Code Online (Sandbox Code Playgroud)
这是一个明确的信息,但是Nullable<T>是一个类,TType?只是一个简写Nullable<TType>.或者我错过了什么?
为什么这不起作用?是否有IEqualityComparer<T>使用该T.HasValue属性的解决方案?
这很简单 - Nullable<>是一个struct,所以它算作一个密封类,在约束中被禁止(显然 - 如果你使用一个密封类作为约束,就不需要使用泛型类型参数 - 你已经完全具有相同类型).
但你根本不需要这样做.只需TType限制struct,但不是使用TEntity,只需TType?在需要可空时使用:
public class NullableEntityComparer<TType> : IEqualityComparer<TType?>
where TType : struct
{
public bool Equals(TType? x, TType? y)
{
if(!x.HasValue && ! y.HasValue) return true;
if(x.HasValue && y.HasValue) return x.Value.Equals(y.Value);
return false;
}
public int GetHashCode(TType? obj)
{
return obj.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
作为附注,nullables已经有一个包含检查空值的相等实现,所以如果你在编译时知道可空类型就可以避免所有这些.
| 归档时间: |
|
| 查看次数: |
343 次 |
| 最近记录: |