类型安全等于()

Equ*_*zer 8 c# equals type-safety

由于我的(单位)测试覆盖率仍然很低,不幸的是,我必须找到很多错误.因此,在重构期间,我严重依赖于C#编译器的类型检查.

今天,我修复了重构期间引入的错误,错过了一行x.Equals(aThingWrappingOriginalThing).就这样bool Equals(object T),编译器没有抱怨.但是,有90%的时间我Equals()直接使用(而不是通过BCL),我打算在逻辑上比较相同类型的对象.

现在我想知道为什么我从来没有见过有人Equals()为这种情况推广类型安全版本(在C#中).这是最好的做法吗?

我很想在这些比较中使用扩展方法,如下所示:

public static bool SafeEquals<T>(this T a, T b)
{
    if (a == null) return b == null;
    return a.Equals(b);
}
public static bool SafeEquals<X>(this IEquatable<X> a, IEquatable<X> b)
{
    if (a == null) return b == null;
    return a.Equals(b);
}
Run Code Online (Sandbox Code Playgroud)

这些可以优化吗?

这是关于我发现的主题的唯一博客文章,对于java:http: //rickyclarkson.blogspot.com/2006/12/making-equalsobject-type-safe.html

Mar*_*ell 5

你在找

EqualityComparer<T>.Default.Equals(x,y);
Run Code Online (Sandbox Code Playgroud)

这支持IEquatable<T>(如果实现),否则使用潜在的拳击Equals(object); 它支持类和结构,两者都有预期的空行为,包括对Nullable<T>(没有装箱)的支持.