0

考虑: EqualityComparer.Default 属性,它在 MSDN 中写道:

Default 属性检查类型 T 是否实现了 System.IEquatable 接口,如果是,则返回使用该实现的 EqualityComparer。否则,它返回一个使用 T 提供的 Object.Equals 和 Object.GetHashCode 覆盖的 EqualityComparer。

我的理解:因为它会返回 EqualityComparer“对象”,所以它应该调用 T 提供的 Object.Equals 和 Object.GetHashCode 的覆盖(如果它覆盖或 Object.Equals 和 Object.GetHashCode,否则)。它怎么会调用 IEquatable 的实现方法呢?是强行做吗?如果是,如何?如果我错了,请纠正我。

这是 MSDN 链接:http: //msdn.microsoft.com/en-us/library/ms224763.aspx

4

1 回答 1

0

首先,在如下的泛型类中,实际上IEquatable<T>无论如何都会选择正确的方法 ( ):

    private class MyEqualityComparer<T> : IEqualityComparer<T> where T : IEquatable<T>
    {
        public bool Equals(T x, T y)
        {
            return x.Equals(y);
        }
        // Hashcode...
    }

而如果您将 y 转换为object,则引用将是object.Equals。这只是一个重载方法,因此在编译时解决。

于 2013-01-30T12:43:22.277 回答