public static void Play() { var unicorn = new Unicorn() { Name = "Pony", Color = "Blue" }; // unicorn impl Deconstruct //_ means discard var(n, c1, _) = unicorn; Console.WriteLine($"{n},{c1}"); //unicorn impl IEnumerable foreach (var s in unicorn) { Console.WriteLine(s); } //unicorn impl IEquatable Console.WriteLine(unicorn == null); //unicorn impl ICloneable var c = new Unicorn(unicorn); //unicorn impl IComparable c.Name = "YiJiang"; Console.WriteLine(c.CompareTo(unicorn) > 0 ? "bigger" : "smaller"); //unicorn has partial impl unicorn.Barking(); //interface mixed in with unicorn (c# 8.0) if (unicorn is Runner runable) { //Run impl in interface def runable.Run(5); } // unicorn.Stop(); //unicorn impl this[int i] Console.WriteLine(unicorn[5]); //pass many params in unicorn.AnyParams(1, 2, 3, "aaa", "bbb"); //unicorn impl implicit byte[] //NOTE Very Ambiguity,DONT USE OFTEN! Only use it on mathematically purpose byte[] b = unicorn; //unicorn impl explicit(byte[]) Unicorn bb = (Unicorn)b; //unicorn impl op+ Console.WriteLine(unicorn + c); }