企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 可重载运算符(C# 编程指南) C# 通过使用 [operator](https://msdn.microsoft.com/zh-CN/library/s53ehcz3.aspx) 关键字定义静态成员函数,来允许用户定义的类型重载运算符。不过并非所有运算符都可以进行重载,并且其他运算符具有限制,如下表所列: | 运算符 | 可重载性 | | --- | --- | | [+](https://msdn.microsoft.com/zh-CN/library/k1a63xkz.aspx)、[-](https://msdn.microsoft.com/zh-CN/library/wch5w409.aspx)、[!](https://msdn.microsoft.com/zh-CN/library/f2kd6eb2.aspx)、[~](https://msdn.microsoft.com/zh-CN/library/d2bd4x66.aspx)、[++](https://msdn.microsoft.com/zh-CN/library/36x43w8w.aspx)、[--](https://msdn.microsoft.com/zh-CN/library/wc3z3k8c.aspx)、[true](https://msdn.microsoft.com/zh-CN/library/eahhcxk2.aspx)、[false](https://msdn.microsoft.com/zh-CN/library/67bxt5ee.aspx) | 这些一元运算符可以进行重载。 | | [+](https://msdn.microsoft.com/zh-CN/library/k1a63xkz.aspx), [-](https://msdn.microsoft.com/zh-CN/library/wch5w409.aspx), [*](https://msdn.microsoft.com/zh-CN/library/z19tbbca.aspx), [/](https://msdn.microsoft.com/zh-CN/library/3b1ff23f.aspx), [%](https://msdn.microsoft.com/zh-CN/library/0w4e0fzs.aspx), [&](https://msdn.microsoft.com/zh-CN/library/sbf85k1c.aspx),[|](https://msdn.microsoft.com/zh-CN/library/kxszd0kx.aspx), [^](https://msdn.microsoft.com/zh-CN/library/zkacc7k1.aspx), [<<](https://msdn.microsoft.com/zh-CN/library/a1sway8w.aspx), [>>](https://msdn.microsoft.com/zh-CN/library/xt18et0d.aspx) | 这些二元运算符可以进行重载。 | | [==](https://msdn.microsoft.com/zh-CN/library/53k8ybth.aspx), [!=](https://msdn.microsoft.com/zh-CN/library/3tz250sf.aspx), [<](https://msdn.microsoft.com/zh-CN/library/z5wecxwa.aspx), [>](https://msdn.microsoft.com/zh-CN/library/yxk8751b.aspx), [<=](https://msdn.microsoft.com/zh-CN/library/hx063734.aspx), [>=](https://msdn.microsoft.com/zh-CN/library/a59bsyk4.aspx) | 比较运算符可以进行重载(但是请参阅此表后面的备注)。 | | [&&](https://msdn.microsoft.com/zh-CN/library/2a723cdk.aspx), [||](https://msdn.microsoft.com/zh-CN/library/6373h346.aspx) | 条件逻辑运算符无法进行重载,但是它们使用 **&** 和 **|**(可以进行重载)来计算。 | | [[]](https://msdn.microsoft.com/zh-CN/library/a3hd7ste.aspx) | 数组索引运算符无法进行重载,但是可以定义索引器。 | | [(T)x](https://msdn.microsoft.com/zh-CN/library/0z4503sa.aspx) | 强制转换运算符无法进行重载,但是可以定义新转换运算符(请参阅 [explicit](https://msdn.microsoft.com/zh-CN/library/xhbhezf4.aspx) 和 [implicit](https://msdn.microsoft.com/zh-CN/library/z5z9kes2.aspx))。 | | [+=](https://msdn.microsoft.com/zh-CN/library/sa7629ew.aspx), [-=](https://msdn.microsoft.com/zh-CN/library/2y9zhhx1.aspx), [*=](https://msdn.microsoft.com/zh-CN/library/s2bkaksf.aspx), [/=](https://msdn.microsoft.com/zh-CN/library/d31sybc9.aspx), [%=](https://msdn.microsoft.com/zh-CN/library/ydwa9zh0.aspx), [&=](https://msdn.microsoft.com/zh-CN/library/e669ax02.aspx), [|=](https://msdn.microsoft.com/zh-CN/library/h5f1zzaw.aspx), [^=](https://msdn.microsoft.com/zh-CN/library/0zbsw2z6.aspx), [<<=](https://msdn.microsoft.com/zh-CN/library/ayt2kcfb.aspx), [>>=](https://msdn.microsoft.com/zh-CN/library/23as4533.aspx) | 赋值运算符无法进行重载,但是 **+=**(举例)使用 **+**(可以进行重载)来计算。 | | [=](https://msdn.microsoft.com/zh-CN/library/sbkb459w.aspx)、[.](https://msdn.microsoft.com/zh-CN/library/6zhxzbds.aspx)、[?:](https://msdn.microsoft.com/zh-CN/library/ty67wk28.aspx)、[??](https://msdn.microsoft.com/zh-CN/library/ms173224.aspx)、[->](https://msdn.microsoft.com/zh-CN/library/s8bz4d5h.aspx)、[=>](https://msdn.microsoft.com/zh-CN/library/bb311046.aspx)、[f(x)](https://msdn.microsoft.com/zh-CN/library/0z4503sa.aspx)、[as](https://msdn.microsoft.com/zh-CN/library/cscsdfbt.aspx)、[checked](https://msdn.microsoft.com/zh-CN/library/74b4xzyw.aspx)、[unchecked](https://msdn.microsoft.com/zh-CN/library/a569z7k8.aspx)、[default](https://msdn.microsoft.com/zh-CN/library/xwth0h0d.aspx)、[delegate](https://msdn.microsoft.com/zh-CN/library/0yw3tz5k.aspx)、[is](https://msdn.microsoft.com/zh-CN/library/scekt9xw.aspx)、[new](https://msdn.microsoft.com/zh-CN/library/51y09td4.aspx)、[sizeof](https://msdn.microsoft.com/zh-CN/library/eahchzkf.aspx)、[typeof](https://msdn.microsoft.com/zh-CN/library/58918ffs.aspx) | 这些运算符无法进行重载。 | | ![](https://box.kancloud.cn/2016-01-31_56adb62c1380a.jpg) 注意 | | :-- | | 如果进行重载,则比较运算符必须成对进行重载;也就是说,如果 **==** 进行重载,则 **!=** 也必须进行重载。反之亦然,对于 **<** 和 **>** 以及 **<=** 和 **>=** 也是类似情况。 | 若要在自定义类上重载运算符,需要在该类上创建具有正确签名的方法。该方法必须命名为“运算符 X”,其中 X 是重载的运算符的名称或符号。一元运算符具有一个参数,二元运算符具有两个参数。在每种情况下,都必须有一个参数与声明运算符的类或结构的类型相同。 ``` public static Complex operator +(Complex c1, Complex c2) { Return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary); } ``` 直接只返回表达式结果的定义很常见。对于这些情况,有一种使用 **=>** 的语法快捷方式。 ``` public static Complex operator +(Complex c1, Complex c2) => new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary); // Override ToString() to display a complex number // in the traditional format: public override string ToString() => $"{this.real} + {this.imaginary}"; ``` 有关详细新,请参阅[如何:使用运算符重载创建复数类(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/6fbs5e2h.aspx)。 ## 请参阅 [C# 编程指南](https://msdn.microsoft.com/zh-CN/library/67ef8sbd.aspx) [语句、表达式和运算符(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173142.aspx) [运算符(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173145.aspx) [C# 运算符](https://msdn.microsoft.com/zh-CN/library/6a71f45d.aspx) [重载的运算符为何在 C# 中始终为静态?](http://go.microsoft.com/fwlink/?LinkId=112383)