static void Main()
        {
            ConcreteObjectA      a  = new ConcreteObjectA();
            ConcreteObjectB      b  = new ConcreteObjectB();
            StronglyTypedVisitor sv = new StronglyTypedVisitor();

            //proper usage of code
            a.AcceptVisitor(sv);
            b.AcceptVisitor(sv);

            //now lets try to do some tricks
            GenericVisitor gv = new GenericVisitor();

            try
            {
                //a.AcceptVisitor(gv); this will generate compile error
                (a as IObject).AcceptVisitor(gv);       //oooo Im so great!
            }
            catch (ArgumentException ae)
            {
                Console.WriteLine("—————————————————————————————n{0}", ae);
            }


            //example with synchronization lost!
            try
            {
                //Im sure it was agreed that the GeneralVisitor accepts ConcreteB, maybe its just a bug, I will try with the interface
                //b.AcceptVisitor(gv); //this will generate compile error
                (b as IObject).AcceptVisitor(gv);       //looks fine to me and the compilator, so it works!
            }
            catch (ArgumentException ae)
            {
                Console.WriteLine("—————————————————————————————n{0}", ae);
            }

            Console.ReadKey();
        }
 public void HandleVisit(ConcreteObjectA aObject)
 {
     Console.WriteLine("Visited by a strongly typed ObjectA instance");
 }