【问题标题】:How to override the == operator如何覆盖 == 运算符
【发布时间】:2014-01-05 14:08:12
【问题描述】:

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

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

但它说:

需要可重载的一元运算符

【问题讨论】:

  • 运算符必须是静态的。

标签: c# operators operator-overloading


【解决方案1】:

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

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

你必须为两个对象实现==

!=

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

见:Guidelines for Overloading Equals() and Operator == (C# Programming Guide)

重载的运算符 == 实现不应引发异常。 任何重载运算符 == 的类型也应该重载运算符 !=。

【讨论】:

  • static 函数不能使用this
  • 问题中的this 肯定是为了表示左操作数。
  • @BenVoigt,我很满意,因为错过了this。但我更关心static和实现!=
  • 也许有点挑剔,但我建议按照== 来实现!=。那是return !(a == b);
  • @JimMischel,是的,这更有意义
【解决方案2】:

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

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

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

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

【讨论】:

  • 那我怎么称呼比较?
  • @user2128702:这部分就像 C++。如果你有两个向量ab,写if (a == b)bool same = (a == b);
  • +1 "语义不正确。"是的。尽管考虑到这一点,他应该覆盖Equals(Vector),并据此实现==。那是return left.Equals(right)
【解决方案3】:

我完全同意 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 ...;
        }

太大,无法作为他的评论发布。希望这会有所帮助。

【讨论】: