2016-07-30 75 views
0

我在C#中編程Unity並且真的很煩人的問題 - 我想定義特殊的Pair類,它具有以下關係:警告:對象定義了運算符==或運算符!=但不覆蓋Object.Equals(對象o)

public class Pair<T1>{ 
    public int First; 
    public T1 Second; 

public bool Equals(Pair<T1> b){ 
    return First == b.First; 
    } 

public static bool operator==(Pair<T1> a, Pair<T1> b){ 
    return a.First == b.First; 
    } 
public static bool operator!=(Pair<T1> a, Pair<T1> b){ 
    return a.First != b.First; 
    } 
} 

這給了我以下警告:

警告CS0660: '對' 定義operator ==或operator =但並沒有 覆蓋的Object.Equals(對象o)(CS0660)(總成 - ! CSharp)

但也當我產生Pair類型與相同的第一個整數的兩個對象時,它們的==運算符返回True(如我所願)。當我只聲明Equals函數時,同樣==運算符返回值False(我知道Unity以某種方式比較它們在內存中的收件人),而沒有警告。是否有任何方法可以避免警告,並仍然得到True==運算符?

+0

一旦你實現''==和'='它建議運營商也覆蓋'Equals'和'GetHashCode'與自定義實現。這就是警告的內容。最常見的'=='和'!='實現調用「Equals」方法,而不是實際具有任何邏輯。 – MarcinJuraszek

回答

2

只需重寫該方法使編譯器高興:

public override bool Equals(object o) 
{ 
    if(o == null) 
     return false; 

    var second = o as Pair<T1>; 

    return second != null && First == second.First; 
} 

public override int GetHashCode() 
{ 
    return First; 
} 

您創建一個自定義equals方法,你需要重寫的對象類(這是在==使用的方法& & !=運算符)

+0

不應該使用這種方法,因爲當o不是'Pair ' –

+0

@MrAnderson時它會拋出'NullReferenceException'我以爲我添加了這個檢查。感謝您指出了這一點。固定。 – user3185569

1

你需要重寫Equal

public override bool Equals(object obj) 
{ 
    if (ReferenceEquals(null, obj)) return false; 
    if (ReferenceEquals(this, obj)) return true; 
    if (obj.GetType() != this.GetType()) return false; 
     return Equals((Pair<T1>) obj); 
} 

而且GetHashCode方法:

public override int GetHashCode() 
{ 
    unchecked 
    { 
     return (First*397)^EqualityComparer<T1>.Default.GetHashCode(Second); 
    } 
}