C# 警告:对象定义运算符==或运算符!=但不覆盖Object.Equals(Object o)
我正在用C#Unity编程,有一个非常恼人的问题-我想用以下关系定义特殊的Pair类:C# 警告:对象定义运算符==或运算符!=但不覆盖Object.Equals(Object o),c#,C#,我正在用C#Unity编程,有一个非常恼人的问题-我想用以下关系定义特殊的Pair类: 公共类对{ 公共int优先; 公共T1秒; 公共布尔等于(b对){ return First==b.First; } 公共静态布尔运算符==(对a、对b){ 返回a.First==b.First; } 公共静态布尔运算符!=(a对,b对){ 返回a.First!=b.First; } } 这给了我以下警告: 警告CS0660:“对”定义运算符==或运算符!=但是 不重写对象。等于(对象o)(CS066
公共类对{
公共int优先;
公共T1秒;
公共布尔等于(b对){
return First==b.First;
}
公共静态布尔运算符==(对a、对b){
返回a.First==b.First;
}
公共静态布尔运算符!=(a对,b对){
返回a.First!=b.First;
}
}
这给了我以下警告:
警告CS0660:“对”定义运算符==或运算符!=但是
不重写对象。等于(对象o)(CS0660)(程序集CSharp)
但是,当我生成两个具有相同第一个整数的
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;
}
public override bool Equals(对象o)
{
如果(o==null)
返回false;
var second=o作为配对;
返回second!=null&&First==second.First;
}
公共覆盖int GetHashCode()
{
先返回;
}
您创建的方法是自定义的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);
}
一旦您实现了
==
和=
运算符建议还使用自定义实现覆盖Equals
和GetHashCode
。这就是警告的内容。==
和的最常见实现=
调用Equals
方法,而不是实际使用任何逻辑。不应使用此方法,因为当o不是对时,它将抛出NullReferenceException
,我以为我添加了该检查。谢谢你指出这一点。已修复。这仍然没有修复<如果o
不是Pair
而是其他类型,则code>o as Pair
将抛出错误。
public override int GetHashCode()
{
unchecked
{
return (First*397) ^ EqualityComparer<T1>.Default.GetHashCode(Second);
}
}