Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 警告:对象定义运算符==或运算符!=但不覆盖Object.Equals(Object o)_C# - Fatal编程技术网

C# 警告:对象定义运算符==或运算符!=但不覆盖Object.Equals(Object o)

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

我正在用C#Unity编程,有一个非常恼人的问题-我想用以下关系定义特殊的Pair类:

公共类对{
公共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);
    }
}