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 }