可重载运算符(C# 编程指南)
C# 通过使用 operator 关键字定义静态成员函数,来允许用户定义的类型重载运算符。不过并非所有运算符都可以进行重载,并且其他运算符具有限制,如下表所列:
运算符 | 可重载性 |
---|---|
+、-、!、~、++、--、true、false | 这些一元运算符可以进行重载。 |
+, -, *, /, %, &,|, ^, <<, >> | 这些二元运算符可以进行重载。 |
==, !=, <, >, <=, >= | 比较运算符可以进行重载(但是请参阅此表后面的备注)。 |
&&, || | 条件逻辑运算符无法进行重载,但是它们使用 & 和 |(可以进行重载)来计算。 |
[] | 数组索引运算符无法进行重载,但是可以定义索引器。 |
(T)x | 强制转换运算符无法进行重载,但是可以定义新转换运算符(请参阅 explicit 和 implicit)。 |
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= | 赋值运算符无法进行重载,但是 +=(举例)使用 +(可以进行重载)来计算。 |
=、.、?:、??、->、=>、f(x)、as、checked、unchecked、default、delegate、is、new、sizeof、typeof | 这些运算符无法进行重载。 |
注意 |
---|
如果进行重载,则比较运算符必须成对进行重载;也就是说,如果 == 进行重载,则 != 也必须进行重载。反之亦然,对于 < 和 > 以及 <= 和 >= 也是类似情况。 |
若要在自定义类上重载运算符,需要在该类上创建具有正确签名的方法。该方法必须命名为“运算符 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# 编程指南)。