首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >IEquatable实现和运算符覆盖

IEquatable实现和运算符覆盖
EN

Stack Overflow用户
提问于 2014-03-15 22:05:16
回答 1查看 1.9K关注 0票数 2

域类T可以是ValueObject<T>类型

public class Coordinate: ValueObject<Coordinate>
{ ... }

ValueObject<T>实现了IEquatable接口。我希望每个具体的ValueObject<T>实现都能为bool Equals(T obj)提供实现,所以我将其创建为一个抽象方法:

public abstract class ValueObject<T> : IEquatable<T>
{
    public abstract bool Equals(T obj);

    public static bool operator ==(ValueObject<T> obj1, ValueObject<T> obj2)
    {
        if (object.ReferenceEquals(obj1, obj2)) return true;
        if (object.ReferenceEquals(obj1, null)) return false;
        if (object.ReferenceEquals(obj2, null)) return false;

        return obj1.Equals(obj2);
    }
}

Coordinate类中的Equals实现:

public class Coordinate : ValueObject<Coordinate>
{
    // ...

    public override bool Equals(Coordinate other)
    {
        return (other != null) && (this.Latitude == other.Latitude) && (this.Longitude == other.Longitude);
    }
}

ValueObject<T>为== (以及上面没有显示的!= )提供了通用操作覆盖,这适用于所有的具体实现。

问题是,当从==覆盖调用Equals方法时,它调用的是Object.Equals(),而不是Coordinate.Equals()

EN

回答 1

Stack Overflow用户

发布于 2014-03-15 22:22:41

当您说obj1.Equals(obj2)时,obj2的类型是ValueObject<T>,它与public abstract bool Equals(T obj)中的T不匹配。

实际上,在运行时,它可以是与T不同的类。

在这种情况下,您可能希望返回false。

public static bool operator ==(ValueObject<T> obj1, ValueObject<T> obj2)
{
    if (object.ReferenceEquals(obj1, obj2)) return true;
    if (object.ReferenceEquals(obj1, null)) return false;
    if (object.ReferenceEquals(obj2, null)) return false;
    if (obj1.GetType() != obj2.GetType()) return false; //new

    return ((T)(object)obj1).Equals((T)(object)obj2);
}

我认为您认为T等同于ValueObject<T>的派生类。你可以说where T : ValueObject<T>。这至少编码了类型系统中所需内容的一部分,并为您节省了(object)类型转换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22424822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档