簡體   English   中英

警告:對象定義運算符 == 或運算符 != 但不會覆蓋 Object.Equals(object o)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM