警告:对象定义operator ==或operator!=但不覆盖Object.Equals(对象o)

时间:2016-07-30 16:58:05

标签: c#

我正在使用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'定义了operator ==或operator!=但是确实如此   不覆盖Object.Equals(对象o)(CS0660)(Assembly-CSharp)

但是当我生成具有相同First整数的Pair类型的两个对象时,他们的==运算符返回True(如我所愿)。当我只声明Equals函数时,相同的==运算符返回False值(我知道Unity会以某种方式比较它们在内存中的收件人),没有任何警告。是否有任何方法可以避免警告并仍然获得True运算符的==值?

2 个答案:

答案 0 :(得分:3)

只需覆盖该方法即可使编译器满意:

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方法,您需要覆盖对象类的方法(在==&amp;&amp;!=运算符中使用)

答案 1 :(得分:2)

您需要覆盖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);
    }
}