在 C# 中重载复合赋值运算符的简单方法?
Posted
技术标签:
【中文标题】在 C# 中重载复合赋值运算符的简单方法?【英文标题】:Simple way to overload compound assignment operator in C#? 【发布时间】:2011-02-21 14:12:37 【问题描述】:有没有人有一个非常简单的例子来说明如何在 C# 中重载复合赋值运算符?
【问题讨论】:
【参考方案1】:您不能显式重载复合赋值运算符。但是,您可以重载 main 运算符,编译器会对其进行扩展。
x += 1
是x = 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# 中重载复合赋值运算符的简单方法?的主要内容,如果未能解决你的问题,请参考以下文章