为什么我不能在C#中重载+ =运算符?但我仍然可以使用它?

2 .net c# operator-overloading

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

我正在玩事件,思想事件很奇怪.为什么我不能在泛型类中实现它们.所以我试着发现我不能超载+ =.从这里找到的语言规范

The overloadable unary operators are:    
+   -   !   ~   ++   --   true   false

The overloadable binary operators are:    
+   -   *   /   %   &   |   ^   <<   >>   ==   !=   >   <   >=   <=
Run Code Online (Sandbox Code Playgroud)

+ =未列出.现在,在你说没有理由重载之前+ =我想提出事实C#有使用+ =运算符的事件以及我试图实现一个有趣的事件并希望使用+ =运算符的事实.现在,我有一种感觉,有人会说这就是为什么事件存在,因为这是唯一的原因.但是我想提出你可以使用+ =与TimeSpan结构.去试试吧,var ts= new TimeSpan(); ts += ts;将编译并运行.

我查看了TimeSpan的定义,我不知道它是如何允许的.我看到了一个public static TimeSpan operator +(TimeSpan t);看起来很可疑的东西,但后来我意识到它var name = +ts;就像你怎么能做到var name = -ts;否定一样.

所以我的问题是,我如何使用+ =作为我的结构或类.它似乎得到支持我似乎无法找到它的文档.

Cod*_*aos 16

事件不超载+=-=运营商.这只是在C#编译器中硬编码,它将其转换为该事件的添加/删除方法.

你只能超负荷+-然后间接超载+=-=.如果你超载,+那么自动x += y变为重载x = x + y.因此,对于您的类型,您不需要进行任何额外的工作.只是过载+,你会得到+=免费的.这当然需要左侧参数和结果类型兼容,但通常情况就是如此.


您不能+=单独重载的原因很可能是它为引用类型创建了奇怪的语义.如果+=修改了左侧的现有实例,那么下面的代码会表现得很奇怪:

MyClass x=new MyClass();
MyClass y=x;
x+=SomeThing;
y has changed now too
Run Code Online (Sandbox Code Playgroud)

在另一方面与+=含义x = x+y此代码创建它分配给x的新实例.并且原始实例在y中保持不变;


另一方面,在C++中,可以安全地指定单独的重载,+=因为您可以同时重载赋值和复制构造函数,并使用它来获取正确的语义.