![](/img/trans.png)
[英]Warning: “… overrides Object.Equals(object o) but does not override Object.GetHashCode()”
[英]Warning: Object defines operator == or operator != but does not override Object.Equals(object o)
我在 C# Unity 中編程並且遇到了非常煩人的問題 - 我想定義具有以下關系的特殊 Pair 類:
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:“Pair”定義運算符 == 或運算符 != 但不覆蓋 Object.Equals(object o) (CS0660) (Assembly-CSharp)
但是,當我生成兩個具有相同 First 整數的Pair
類型對象時,它們的==
運算符返回True
(如我所願)。 當我只聲明 Equals 函數時,相同的==
運算符返回False
值(我知道 Unity 以某種方式比較內存中的收件人),沒有警告。 是否有任何方法可以避免警告並仍然獲得==
運算符的True
值?
只需覆蓋該方法即可使編譯器滿意:
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 方法,您需要覆蓋對象類的方法(在 == && != 運算符中使用)
您需要覆蓋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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.