在 C# 中重载复合赋值运算符的简单方法?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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);

【讨论】:

这是一篇关于 C# 中重载运算符主题的好文章:informit.com/articles/article.aspx?p=101373&seqNum=15 我知道这样可以重载,我只想要一个非常简单的代码示例。有人吗? 谢谢,这正是我需要的 'x += 1 是 x = x + 1 的纯粹语法糖' 这并不完全正确。看我的回答。 这也解释了 x+=1 和 x=x+1 之间的区别:blogs.msdn.com/b/ericlippert/archive/2011/03/29/…【参考方案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 您可以重载 + 运算符,从而改变 += 运算符的行为。所以是的,这是可能的。

以上是关于在 C# 中重载复合赋值运算符的简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

复制构造函数与赋值运算符(=)有何不同

重载“着色器”类中的赋值运算符

C#基础之005 常用运算符 1

JavaScript中赋值运算符的使用

赋值运算符

C++ - 让派生类从基类“继承”重载赋值运算符的安全/标准方法