我试图覆盖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();
}
有什么问题?当我尝试单步执行它时,我的覆盖甚至没有进入。
答案 0 :(得分:11)
对象的Equals()方法与'=='运算符不同。您需要在类型上重载'=='运算符,或者调用i1.Equals(i2)
而不是i1 == i2
。
答案 1 :(得分:2)
operator ==
默认情况下会告诉您i1
和i2
是否指向同一个对象(他们没有)。 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()
,否则您的类可能无法正常工作。