CLR对操作符重载一无所知,它甚至不知道什么是操作符。是编程语言定义了每个操作符的含义,以及当这些特殊符号出现时,应该生成什么样的代码。
例如在C#中,向基元(类型的)数字应用+符号,编译器生成将两个数加到一起的代码。将+符号应用于string对象,C#编译器生成将两个字符串连接到一起的代码。测试不等性时,C#使用 != 符号,^在C#中含义为异或(XOR)。
虽然CLR对操作符一无所知,但它确实规定了语言应如何公开操作符重载,以便由另一种语言的代码使用。每种编程语言都要自行决定是否支持操作符重载。如果决定支持,还要决定用什么语法来表示和使用他们。至于CLR,操作符重载只是方法而已。
对编程语言的选择决定了你是否获得对操作符重载的支持,以及具体的语法是什么。编译源码时,编译器会生成一个标识操作符行为的方法。CLR要求操作符重载方法必须是public和static方法。另外,C#要求操作符重载方法至少有一个参数的类型与当前定义这个方法的类型相同。之所以要进行这样的限制,是为了使C#编译器能在合理的时间内找到要绑定的操作符方法。
C#操作符 | 特殊方法名 | 推荐的相容于CLS的方法名 |
---|---|---|
+ | op_UnaryPlus | Plus |
- | op_UnaryNegation | Negate |
! | op_LogicalNot | Not |
~ | op_OnesComplement | OnesComplement |
++ | op_Increment | Increment |
-- | op_Decrement | Decrement |
无 | op_True | IsTrue{get;} |
无 | op_False | IsFalse{get;} |
C#操作符 | 特殊方法名 | 推荐的相容于CLS的方法名 |
---|---|---|
+ | op_Addition | Add |
- | op_Subtraction | Subtract |
* | op_Multiply | Multiply |
/ | op_Division | Divide |
% | op_Modulus | Mod |
& | op_BitwiseAnd | BitwiseAnd |
| | op_BitwiseOr | BitwiseOr |
^ | op_ExclusiveOr | Xor |
<< | op_LeftShift | LeftShift |
>> | op_RightShift | RightShift |
== | op_Equality | Equals |
!= | op_Inequality | Equals |
< | op_LessThan | Compare |
> | op_GreaterThan | Compare |
<= | op_LessThanOrEqual | Compare |
>= | op_GreaterThanOrEqual | Compare |