我正在使用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
运算符的==
值?
答案 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);
}
}