2010-12-07 38 views
3

我试图重载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

使用==操作符与调用i1.Equals(i2)相同;我会说不,但你每天都会学到新的东西...... – Rob 2010-12-07 02:06:10

回答

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

0

如前所述使用i1.Equals(i2)比较 - 另外也请记住,你必须忽略equals当覆盖GetHashCode(),否则预期类可能无法正常工作。