public static void Go(){ MyUnion2 u2 = new MyUnion2(); MyUnion1 u1 = new MyUnion1(); u1.i = 0; u1.o.o = new Bar(); Console.WriteLine("BEFORE: u1.o.o.getI(): {0}. (EXPECT 1)",u1.o.o.getI()); u2.i = 0; u2.o.o = new Foo(); // write the Foo's objref value now in u2.o into the int field of u1, // thereby overwriting the Bar objref that had been in u1.o. u1.i = u2.i; // If u1.o.o.getI() returns 42, that means that we were able to write to a private // member variable of Bar, a huge security problem! int curI = u1.o.o.getI(); Console.WriteLine("AFTER: u1.o.o.getI(): {0}. (BUG if 42)",curI); }