using System; namespace Juliet { class Program { static void Main(string[] args) { Union3[] unions = new Union3[] { new Union3(5), new Union3('x'), new Union3("Juliet") }; foreach (Union3 union in unions) { string value = union.Match( num => num.ToString(), character => new string(new char[] { character }), word => word); Console.WriteLine("Matched union with value '{0}'", value); } Console.ReadLine(); } } public sealed class Union3 { readonly A Item1; readonly B Item2; readonly C Item3; int tag; public Union3(A item) { Item1 = item; tag = 0; } public Union3(B item) { Item2 = item; tag = 1; } public Union3(C item) { Item3 = item; tag = 2; } public T Match(Func f, Func g, Func h) { switch (tag) { case 0: return f(Item1); case 1: return g(Item2); case 2: return h(Item3); default: throw new Exception("Unrecognized tag value: " + tag); } } } }