【问题标题】:Simple way to overload compound assignment operator in C#?在 C# 中重载复合赋值运算符的简单方法?
【发布时间】:2011-02-21 14:12:37
【问题描述】:

有没有人有一个非常简单的例子来说明如何在 C# 中重载复合赋值运算符?

【问题讨论】:

    标签: c# operator-overloading overloading


    【解决方案1】:

    您不能显式重载复合赋值运算符。但是,您可以重载 main 运算符,编译器会对其进行扩展。

    x += 1x = x + 1 的纯语法糖,而后者就是它将被翻译成的内容。如果重载+ 运算符,它将被调用。

    MSDN Operator Overloading Tutorial

    public static Complex operator +(Complex c1, Complex c2) 
    {
       return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary);
    }
    

    【讨论】:

    【解决方案2】:

    根据 C# 规范,+= 不在可重载运算符列表中。我认为,这是因为它也是一个赋值运算符,不允许重载。但是,与此处其他答案中所述不同,“x += 1”与“x = x + 1” 相同。 C# 规范“7.17.2 复合赋值”对此非常清楚:

    ... the operation is evaluated as x = x op y, except that x is evaluated only once
    

    重要的部分是最后一部分:x 只被评估一次。所以在这样的情况下:

    A[B()] = A[B()] + 1; 
    

    它可以(并且确实)有所作为,如何制定您的陈述。但我认为,在大多数情况下,差异可以忽略不计。 (即使我只是遇到一个,它不是。)

    因此,问题的答案是:不能覆盖 += 运算符。对于可以通过简单的二元运算符实现意图的情况,可以覆盖 + 运算符并实现类似的目标。

    【讨论】:

      【解决方案3】:

      您不能在 C# 中重载这些运算符。

      【讨论】:

      • Stephan 的帖子表明您可以。当然,您不能从 + 运算符正交覆盖它,但是,嘿,这在技术上是可能的。
      • @dss539 - 间接,当然。我只是在回答他的问题。
      • @dss539 - “技术上可行”?如果有的话,“技术上可能”正是它所不具备的。
      • @Tod 您可以重载 + 运算符,从而改变 += 运算符的行为。所以是的,这是可能的。
      猜你喜欢
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 2013-02-27
      • 2020-04-17
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多