L'overload degli operatori è un tecnica per dare un significato ad una espressione matematico/logica, quando gli operandi siano tipi custom creati dallo sviluppatore. Supponiamo quindi di avere una classe Alfa contenente un numero X e che l'operazione:
Alfa a, b; a = new Alfa() { X = 10 }; b = new Alfa() { X = 20 }; Console.WriteLine((a + b).X);
class Alfa { public int X { get; set; } public static Alfa operator +(Alfa a, Alfa b) { return new Alfa() { X = a.X + b.X }; } }
Operatori di conversioneSarebbe bello avere due classi e definire il casting da una istanza di una classe ad un'altra, senza provocare un errore di compilazione ed anzi, ottenendo la semantica voluta? Si può, ma partiamo dalle definzioni:
//Casting implicito int a=20; long b=a; //Casting esplicito long a=30; int b=(int)a;
class Alfa { public int X { get; set; } public static Alfa operator +(Alfa a, Alfa b) { return new Alfa() { X = a.X + b.X }; } public static implicit operator int(Alfa a) { return a.X; } }
Alfa a, b; a = new Alfa() { X = 10 }; b = new Alfa() { X = 20 }; int res = a + b;
int res = ((int)(a + b));
public static explicit operator int(Alfa a) { return a.X; }