通过使用operator关键字public和andstatic修饰符,可以使大多数内置运算符(包括转换运算符)超载。
运算符有三种形式:一元运算符,二进制运算符和转换运算符。
一元和二元运算符至少需要一个与包含类型相同的参数,有些则需要互补的匹配运算符。
转换运算符必须与封闭类型进行转换。
public struct Vector32 { public Vector32(int x, int y) { X = x; Y = y; } public int X { get; } public int Y { get; } public static bool operator ==(Vector32 left, Vector32 right) =>left.X==right.X&&left.Y== right.Y; public static bool operator !=(Vector32 left, Vector32 right) => !(left == right); public static Vector32 operator +(Vector32 left, Vector32 right) => new Vector32(left.X + right.X,left.Y+ right.Y); public static Vector32 operator +(Vector32 left, int right) => new Vector32(left.X + right,left.Y+ right); public static Vector32 operator +(int left, Vector32 right) => right + left; public static Vector32 operator -(Vector32 left, Vector32 right) => new Vector32(left.X - right.X,left.Y- right.Y); public static Vector32 operator -(Vector32 left, int right) => new Vector32(left.X - right,left.Y- right); public static Vector32 operator -(int left, Vector32 right) => right - left; public static implicit operator Vector64(Vector32 vector) => new Vector64(vector.X, vector.Y); public override string ToString() => $"{{{X}, {Y}}}"; } public struct Vector64 { public Vector64(long x, long y) { X = x; Y = y; } public long X { get; } public long Y { get; } public override string ToString() => $"{{{X}, {Y}}}"; }
例
var vector1 = new Vector32(15, 39); var vector2 = new Vector32(87, 64); Console.WriteLine(vector1 == vector2); // 假 Console.WriteLine(vector1 != vector2); // 真 Console.WriteLine(vector1 + vector2); // {102,103} Console.WriteLine(vector1 - vector2); // {-72,-25}