using System; namespace _01OperatorTrueFalse { public struct LaunchStatus { public static readonly LaunchStatus Green = new LaunchStatus(0); public static readonly LaunchStatus Yellow = new LaunchStatus(1); public static readonly LaunchStatus Red = new LaunchStatus(2); private int status; private LaunchStatus(int status) { this.status = status; } public static bool operator true(LaunchStatus x) => x == Green || x == Yellow; public static bool operator false(LaunchStatus x) => x == Red; public static LaunchStatus operator &(LaunchStatus x, LaunchStatus y) { if (x == Red || y == Red || (x == Yellow && y == Yellow)) { return Red; } if (x == Yellow || y == Yellow) { return Yellow; } return Green; } public static bool operator ==(LaunchStatus x, LaunchStatus y) => x.status == y.status; public static bool operator !=(LaunchStatus x, LaunchStatus y) => !(x == y); public override bool Equals(object obj) => obj is LaunchStatus other && this == other; // Equals testet, ob ein hier: Launchstatus-Obj. gleich einem anderen OBJEKT ist // Dies setzt gleiche Typen und gleiche Inhalte voraus! public override int GetHashCode() => status; } public class LaunchStatusTest { public static void Main() { // Wichtig! Die nächste Zeile zeigt die Short-Cut-Evaluation durch das Überladen von // true und false! Es erfolgt jeweils eine implizite Wandlung nach bool durch die // Überladung von true und false. Daher wird GetNavigationLaunchStatus nur aufgerufen, // wenn GetFuelLauchStatus gleich true ist! LaunchStatus okToLaunch1 = GetFuelLaunchStatus() && GetNavigationLaunchStatus(); // GetFuelLauchStatus() --> LaunchStatus ---(op true)--> bool // Wenn true --> GetNavigationLaunchStatus() --> LaunschStatus ---(op true)--> bool // GetFuelLaunchStatus() & GetNavigationLaunchStatus(); --- Einfaches & Console.WriteLine("----------------"); LaunchStatus okToLaunch2 = GetFuelLaunchStatus() & GetNavigationLaunchStatus(); // Nochmals: Durch das überladene true ist der nachfolgende Ausdruck zulässig! Console.WriteLine("----------------"); Console.WriteLine(okToLaunch1 ? "Ready to go!" : "Wait!"); // okToLaunch1 ---(op true)--> bool //if (okToLaunch1.Equals(okToLaunch2)) } static LaunchStatus GetFuelLaunchStatus() { Console.WriteLine("Getting fuel launch status..."); return LaunchStatus.Red; } static LaunchStatus GetNavigationLaunchStatus() { Console.WriteLine("Getting navigation launch status..."); return LaunchStatus.Yellow; } } }