压倒等于运算符

时间:2010-12-07 02:02:47

标签: c#

我试图覆盖Equals,以便根据变量ID进行比较:

public class OrderID
{
    public string ID { get; private set; }

    public OrderID(string id)
    {
        ID = id;
    }

    public override bool Equals(object obj)
    {
        if (obj is OrderID)
        {
            return ((OrderID)obj).ID == ID;
        }
        else return false;
    }

    public override string ToString()
    {
        return ID;
    }
}

但是,当我按以下方式测试时,它返回false:

static void Main(string[] args)
{

    OrderID i1 = new OrderID("Hello");
    OrderID i2 = new OrderID("Hello");

    bool test = i1 == i2;

    Console.WriteLine(test.ToString());
    Console.ReadKey();
}

有什么问题?当我尝试单步执行它时,我的覆盖甚至没有进入。

3 个答案:

答案 0 :(得分:11)

对象的Equals()方法与'=='运算符不同。您需要在类型上重载'=='运算符,或者调用i1.Equals(i2)而不是i1 == i2

MSDN Guidelines for Overloading Equals() and Operator ==

答案 1 :(得分:2)

operator ==默认情况下会告诉您i1i2是否指向同一个对象(他们没有)。 operator ==可以被覆盖,但仅建议用于不可变类型。

你想要的是:

bool test = i1.Equals(i2);

并使用.Equals ID而不是operator == ID

if (obj is OrderID)
{
  return ((OrderID)obj).ID.Equals(ID);
}

要检查引用相等性,请使用ReferenceEquals。要检查值是否相等,请使用Equals

答案 2 :(得分:0)

如上所述,使用i1.Equals(i2)进行比较 - 此外还要记住,在覆盖Equals时必须覆盖GetHashCode(),否则您的类可能无法正常工作。