为什么我不能在C#中重载+ =运算符? 但我仍然可以使用它?
可能重复:
在C#中重载复合赋值运算符的简单方法?
我正在玩事件,思想事件很奇怪。 为什么我不能在generics类中实现它们。 所以我试着发现我不能超载+ =。 从这里找到的语言规范
The overloadable unary operators are: + - ! ~ ++ -- true false The overloadable binary operators are: + - * / % & | ^ <> == != > = <=
+ =未列出。 现在,在你说没有理由超载之前+ =我想提出事实C#有使用+ =运算符的事件以及我试图实现一个有趣的事件并希望使用+ =运算符的事实。 现在,我有一种感觉,有人会说这就是为什么事件存在,因为这是唯一的原因。 但是我想提出你可以使用+ =与TimeSpan结构。 去试试吧, var ts= new TimeSpan(); ts += ts;
var ts= new TimeSpan(); ts += ts;
将编译并运行。
我查看了TimeSpan定义,我不知道它是如何允许的。 我看到了一个public static TimeSpan operator +(TimeSpan t);
这看起来很可疑,但后来我发现它像var name = +ts;
就像你怎么做var name = -ts;
否定。
所以我的问题是,我如何使用+ =作为我的结构或类。 它似乎得到支持我似乎无法找到它的文档。
事件不会使+=
和-=
运算符重载。 这只是在C#编译器中硬编码,它将其转换为该事件的添加/删除方法。
你只能重载+
和-
然后间接重载+=
和-=
。 如果你重载+
那么自动x += y
就会重载到x = x + y
。 因此,对于您的类型,您不需要进行任何额外的工作。 只要超载+
你就可以免费获得+=
。 这当然需要左侧参数和结果类型兼容,但通常情况就是如此。
你不能单独重载+=
的原因很可能是它为引用类型创建了奇怪的语义。 如果+=
修改了左侧的现有实例,那么下面的代码会表现得很奇怪:
MyClass x=new MyClass(); MyClass y=x; x+=SomeThing; y has changed now too
另一方面, +=
表示x = x+y
此代码创建一个新实例,并将其分配给x。 并且原始实例在y中保持不变;
另一方面,在C ++中,可以安全地为+=
指定单独的重载,因为您可以同时重载赋值和复制构造函数,并使用它来获取正确的语义。
+ =运算符不能直接重载,但用户定义的类型可能会使+运算符重载。
使用+ =赋值运算符的表达式,例如Copy
x + = y
相当于复制
x = x + y
MSDN
+=
只是添加的简写,然后是赋值。 你可以重载+
运算符,这也使+=
运算符工作:
这个编译
class P { public static P operator +(P rhs, P lhs) { return null; } } void Main() { P p = new P(); p += new P(); }
(当然,反之亦然-
和-=
运算符)。
文档不是谎言。 +=
运算符重载是不可能的。
+=
运算符只是使用+
运算符的快捷方式。 编译器将x += y
操作转换为x = x + y
。
因此,要更改+=
运算符的作用,必须重载+
运算符。
- 在构建我的c#项目时,我正在“在未引用的程序集中定义”错误,如何解决它?
- 引用ASP.NET Core中的现有.NET Framework项目
- 拖放动态创建的快捷方式
- 如果String是引用类型,为什么类型String的Type.IsByRef返回false?
- 如何通过堆栈跟踪访问本地? (模仿动态范围)
- 如何检查是否可以在特定文件夹中创建文件
- 如何从Process.Start打开到同一浏览器窗口或选项卡的链接?
- Ploeh AutoFixture无法从System.Runtime.Serialization.ExtensionDataObject创建实例
- 以编程方式在Windows Phone 7中打开docx