【问题标题】:Overloading operator < in C# [duplicate]在 C# 中重载运算符 < [重复]
【发布时间】:2017-01-23 12:44:09
【问题描述】:

我有以下代码:

public class Foo
{
    public static bool operator<(Foo l, Foo f)
    {
        Console.WriteLine("Foo!");
        return false;
    }
    //public static bool operator>(Foo l, Foo f)
    //{
    //    return f < l;
    //}
}

编译器通过消息告知错误:

运算符 'Program.Foo.operator '

这对我来说似乎很奇怪。为什么我要超载 operator&gt;

【问题讨论】:

  • 为什么这么奇怪?如果定义 obj1 何时小于 obj2,则还应定义 obj1 何时大于 obj2
  • 我会说 not 重载两者都是“奇怪的”。发现a &lt; bb &gt; a 不同,我肯定会感到惊讶。
  • @LmTinyToon 不,这是一个预先修复的错误。
  • 如果你有一个小于运算符,你也有一个大于运算符。如果您的 &lt; 运算符并不意味着“小于”,那么您可能不应该拥有它。改用一种方法。运算符应该有明确的含义。
  • "但我永远无法使用运算符 >" - 也许不会现在但那将永远是案子?其他编写代码的人呢?他们可能会使用它?你打算怎么做,四处走走,从每个人的键盘上撕下 > 键,以防止他们在你的代码中使用它?

标签: c# operator-overloading


【解决方案1】:

因为该运算符成对出现(如==!=)。它希望您同时实现两者,以确保您不会意外忘记它。如果你说&lt; 的行为不同,&gt; 也应该如此,因此你也不得不重载它。

正如MSDN 所说:

用户定义的类型可以重载&lt; 运算符。如果一个类型重载了“小于”运算符&lt;,它也必须重载“大于”运算符&gt;

【讨论】:

  • 看起来 MSDN 页面现已更新,不再这么说,但对我来说,这句话本身听起来像是在谈论其他二进制运算符,例如重载二进制“+”运算符还会隐式重载“+=”运算符(而当比较运算符成对出现时,它不是隐式的,而是强制显式的)。似乎此注释不适用于比较运算符(因为它们没有等效的赋值运算符),这可能是它不再包含在页面中的原因。
  • @NotEnoughData 更新了最新的文档,这仍然支持我的回答。
【解决方案2】:

来自Overloadable Operators

比较运算符,如果重载,必须成对重载;也就是说,如果 == 被重载, != 也必须被重载。

反之亦然,对于 以及对于 = 也是如此。

【讨论】:

    【解决方案3】:

    我可以推测原因是由于不等式运算符的数学特性。 https://en.wikipedia.org/wiki/Inequality_(mathematics)

    > 是 的逆

    如果编译器假定了这些属性并允许将它们交换为另一个,那就不足为奇了。即使不允许编译器这样做 - 生成的代码也将难以管理。

    例如以重构工具为例 - 反转运算符是其中相当常见的功能。

    【讨论】:

    • 如果我没记错的话, >= 是
    • 似乎 (参见 wiki):aa 但是,与 (a > b) 相对的是 (a
    【解决方案4】:

    这是比较运算符重载的规则。您只能成对地重载这些运算符:

    • ==!=
    • &lt;&gt;
    • &lt;=&gt;=

    比较运算符,如果重载,必须成对重载; 也就是说,如果 == 被重载, != 也必须被重载。相反 也是如此,对于 以及对于 = 也是如此。

    MSDN Source - Overloadable Operators (C# Programming Guide)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-27
      • 2012-12-22
      • 2016-09-26
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      相关资源
      最近更新 更多