C#中可重载运算符包括一元的+、-、!、~、++、–、true、false,二元的+、-、*、/、%、&、|、^、、==、!=、、=,且==与!=等须成对重载;不可重载&&、||、?:、=等。
运算符重载在 C# 中只能在 struct 或 class 内部用 public static 方法实现,且必须使用 operator 关键字声明;不能重载所有运算符,也不能改变运算符优先级或结合性。
哪些运算符可以重载
C# 允许重载的运算符有明确限制。可重载的包括:
- 一元运算符:
+、-、!、~、++、--、true、false - 二元运算符:
+、-、*、/、%、&、|、^、、>>、==、!=、、>、、>= - 必须成对重载:
==和!=、和>、和>=、true和false
不可重载的包括:&&、||、?:、=、.、?:、->、sizeof、typeof、new、checked、unchecked 等。
重载 == 和 != 的正确写法
这是最容易出错的地方:重载 == 后,编译器会强制要求同时重载 !=,并且还必须重写 Equals(object) 和 GetHashCode(),否则会触发 CS0660 / CS0661 警告。
典型错误是只重载 ==,或在 == 中直接调用 object.ReferenceEquals 但没处理 null 参数。
public class Vector2
{
public double X { get; }
public double Y { get; }
public Vector2(double x, double y) => (X, Y) = (x, y);
public static bool operator ==(Vector2 a, Vector2 b)
{
if (ReferenceEquals(a, b)) return true;
if (a is null || b is null) return false;
return a.X == b.X && a.Y == b.Y;
}
public static bool operator !=(Vector2 a, Vector2 b) => !(a == b);
public override bool Equals(object obj) => obj is Vector2 v && this == v;
public override int GetHashCode() => HashCode.Combine(X, Y);
}