Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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# 使用Equals()重写相等运算符_C#_Operators_Overriding_Equality - Fatal编程技术网

C# 使用Equals()重写相等运算符

C# 使用Equals()重写相等运算符,c#,operators,overriding,equality,C#,Operators,Overriding,Equality,我已经调试一个问题很长时间了,并且意识到它来自于在我应该使用对象的对象上使用=。Equals() 为了防止此类问题,希望=操作符调用我已重写的对象.Equals() 可能吗?以下代码遇到堆栈溢出异常 public static bool operator ==(Portfolio a, Portfolio b) { return a != null && a.Equals(b); } public static bool operator !=(Portfolio a,

我已经调试一个问题很长时间了,并且意识到它来自于在我应该使用
对象的对象上使用
=
。Equals()

为了防止此类问题,希望
=
操作符调用我已重写的
对象.Equals()

可能吗?以下代码遇到堆栈溢出异常

public static bool operator ==(Portfolio a, Portfolio b)
{
    return a != null && a.Equals(b);
}

public static bool operator !=(Portfolio a, Portfolio b)
{
    return a != null && !a.Equals(b);
}

谢谢

您正在递归调用
=中的code>运算符=运算符,因此堆栈溢出。改用
ReferenceEquals

public static bool operator !=(Portfolio a, Portfolio b)
{
    return !object.ReferenceEquals(a, null) && !a.Equals(b);
}
这就是说,此代码有缺陷,因为如果
a
为null而
b
为null,它将返回
false
。您应该检查这两个对象是否为空:

public static bool operator !=(Portfolio a, Portfolio b)
{
    if (object.ReferenceEquals(a, null))
    {
        return !object.ReferenceEquals(b, null);
    }

    return !a.Equals(b);
}

您正在递归调用
=中的code>运算符=运算符,因此堆栈溢出。改用
ReferenceEquals

public static bool operator !=(Portfolio a, Portfolio b)
{
    return !object.ReferenceEquals(a, null) && !a.Equals(b);
}
这就是说,此代码有缺陷,因为如果
a
为null而
b
为null,它将返回
false
。您应该检查这两个对象是否为空:

public static bool operator !=(Portfolio a, Portfolio b)
{
    if (object.ReferenceEquals(a, null))
    {
        return !object.ReferenceEquals(b, null);
    }

    return !a.Equals(b);
}

你的
Equals
看起来怎么样?你的
Equals
看起来怎么样?通常我喜欢让一个
private/protected静态bool等于([type]a[type]b){if(ReferenceEquals(a,b)){return true;}if(ReferenceEquals(a,null)| ReferenceEquals(b,null)){return false;}/*知道a和b不是空引用的逻辑*/}
然后
公共重写bool Equals(object obj){返回等于(这个,obj作为[type]);}
公共静态bool操作符==([type]a,[type]b){return Equals(a,b);}
公共静态bool操作符=([type]a[type]b){return!Equals(a,b);}
如果类型应该是可比较的,我会使用这种方法:Hi。谢谢实际上在同一时间提出了相同的解决方案:)通常我喜欢使一个
私有/受保护的静态bool等于([type]a,[type]b){if(ReferenceEquals(a,b)){return true;}if(ReferenceEquals(a,null)| ReferenceEquals(b,null)){return false;}/*知道a和b不是null引用的逻辑*/}
然后
公共重写bool Equals(object obj){return Equals(这个,obj作为[type]);}
公共静态bool操作符==([type]a[type]b){return Equals(a,b);}
公共静态bool操作符=([type]a[type]b){return!Equals(a,b);}
如果类型应该是可比较的,我会使用这种方法:Hi。谢谢实际上在同一时间提出了相同的解决方案:)