【问题标题】:How to forcibly call interface implemented method?如何强制调用接口实现的方法?
【发布时间】:2013-01-30 20:43:22
【问题描述】:

考虑:EqualityComparer.Default 属性,其在 MSDN 中写为:

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

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

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

【问题讨论】:

    标签: c#


    【解决方案1】:

    首先,在如下的泛型类中,实际上无论如何都会选择正确的方法(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。这只是一个重载方法,所以在编译时就解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 2013-02-19
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      相关资源
      最近更新 更多