2010-12-07 50 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(),否則預期類可能無法正常工作。