operator C# with Example
Most of the built-in operators (including conversion operators) can be overloaded by using the operator keyword along with the public and static modifiers. The operators comes in three forms: unary operators, binary operators and conversion operators. Unary and binary operators requires at least one parameter of same type as the containing type, and some requires a complementary matching operator. Conversion operators must convert to or from the enclosing type. 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}}}"; } Example var vector1 = new Vector32(15, 39); var vector2 = new Vector32(87, 64); Console.WriteLine(vector1 == vector2); // false Console.WriteLine(vector1 != vector2); // true Console.WriteLine(vector1 + vector2); // {102, 103} Console.WriteLine(vector1 - vector2); // {-72, -25}