如何覆盖==运算符

时间:2013-12-17 17:11:59

标签: c# operators operator-overloading

如何为我的班级实例定义运算符==?我试过这样:

public bool operator == (Vector anotherVector)
{
    return this.CompareTo(anotherVector) == 1 ;              
}

但它说:

  

可重载的一元运算符

3 个答案:

答案 0 :(得分:9)

您需要将方法标记为static,并且还必须实现不等于!=

public static bool operator ==(Vector currentVector,Vector anotherVector)
{
    return currentVector.CompareTo(anotherVector) == 1 ;              
}

您必须为两个对象实施==

AND !=

AND

public static bool operator !=(Vector currentVector,Vector anotherVector)
{
    return !(currentVector.CompareTo(anotherVector) == 1) ;
}

请参阅:Guidelines for Overloading Equals() and Operator == (C# Programming Guide)

  

重载的operator ==实现不应该抛出异常。   任何重载operator ==的类型也应该重载operator!=。

答案 1 :(得分:3)

与C ++不同,C ++允许将运算符定义为实例成员函数,以便左操作数成为this指针,C#运算符重载始终作为静态成员函数完成。

没有this指针,两个操作数都是显式参数。

public static bool operator==(Vector left, Vector right)
{
    return left.CompareTo(right) == 1;              
}

(虽然这似乎在语义上不正确,但通常CompareTo为等价返回零)

答案 2 :(得分:2)

我完全赞同Habib的回答 - 同时也给它+1了......只是不要忘记处理空值。

public static bool operator ==(Vector left, Vector right)
        {
            if ((object)left == null)
                return (object)left == null;

            if ((object)right == null)
                return false;

            return ...;
        }

太大了,无法发表评论。希望这会有所帮助。