public static void TestPakaging2()
        {
            Point1 p = new Point1(1, 1);
            Console.WriteLine(p);
            p.Change(2, 2);
            Console.WriteLine(p);

            Object o = p;
            Console.WriteLine(o);

            ((Point1)o).Change(3, 3);
            // При таком приведении типа o распаковывается, и поля упакованного объекта типа Point копируются во временный объект типа Point в стеке потока. Поля m_x и m_y этого временного объекта устанавливаются равными 3, но это обращение к Change не влияет на упакованный объект Point. При обращении к WriteLine снова выводится (2, 2). Для многих разработчиков это оказывается неожиданным.
            Console.WriteLine(o);


            Point2 p2 = new Point2(1, 1);
            Console.WriteLine(p2);
            p2.Change(2, 2);
            Console.WriteLine(p2);
            Object o2 = p2;
            Console.WriteLine(o2);
            ((Point2)o2).Change(3, 3);
            Console.WriteLine(o2);

            // p упаковывается, упакованный объект изменяется и освобождается
            ((IChangeBoxedPoint)p2).Change(4, 4);
            Console.WriteLine(p2); // 2 2
            // Упакованный объект изменяется и выводится
            ((IChangeBoxedPoint)o2).Change(5, 5);
            Console.WriteLine(o2); // 5 5
        }