可重载运算符(C# 编程指南)

C# 通过使用 operator 关键字定义静态成员函数,来允许用户定义的类型重载运算符。不过并非所有运算符都可以进行重载,并且其他运算符具有限制,如下表所列:

运算符 可重载性
+-!~++--truefalse 这些一元运算符可以进行重载。
+, -, *, /, %, &,|, ^, <<, >> 这些二元运算符可以进行重载。
==, !=, <, >, <=, >= 比较运算符可以进行重载(但是请参阅此表后面的备注)。
&&, || 条件逻辑运算符无法进行重载,但是它们使用 &|(可以进行重载)来计算。
[] 数组索引运算符无法进行重载,但是可以定义索引器。
(T)x 强制转换运算符无法进行重载,但是可以定义新转换运算符(请参阅 explicitimplicit)。
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= 赋值运算符无法进行重载,但是 +=(举例)使用 +(可以进行重载)来计算。
=.?:??->=>f(x)ascheckeduncheckeddefaultdelegateisnewsizeoftypeof 这些运算符无法进行重载。
注意
如果进行重载,则比较运算符必须成对进行重载;也就是说,如果 == 进行重载,则 != 也必须进行重载。反之亦然,对于 <> 以及 <=>= 也是类似情况。

若要在自定义类上重载运算符,需要在该类上创建具有正确签名的方法。该方法必须命名为“运算符 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# 编程指南)

请参阅

C# 编程指南

语句、表达式和运算符(C# 编程指南)

运算符(C# 编程指南)

C# 运算符

重载的运算符为何在 C# 中始终为静态?