public static void TestPakaging1() { // Создаем в стеке два экземпляра Point MyPoint p1 = new MyPoint(10, 10); MyPoint p2 = new MyPoint(20, 20); // p1 НЕ пакуется для вызова ToString (виртуальный метод) Console.WriteLine(p1.ToString()); // "(10, 10)" // p1 ПАКУЕТСЯ для вызова GetType (невиртуальный метод) Console.WriteLine(p1.GetType()); // "MyPoint" // p1 НЕ пакуется для вызова CompareTo // p2 НЕ пакуется, потому что вызван CompareTo(MyPoint) Console.WriteLine(p1.CompareTo(p2)); // "-1" // p1 пакуется , а ссылка размещается в c IComparable c = p1; Console.WriteLine(c.GetType()); // "MyPoint" // p1 НЕ пакуется для вызова CompareTo // Поскольку в CompareTo не передается переменная MyPoint, // вызывается CompareTo(Object), которому нужна ссылка // на упакованный MyPoint // c НЕ пакуется, потому что уже ссылается на упакованный MyPoint Console.WriteLine(p1.CompareTo(c)); // "0" // c НЕ пакуется, потому что уже ссылается на упакованный MyPoint // p2 ПАКУЕТСЯ, потому что вызывается CompareTo(Object) Console.WriteLine(c.CompareTo(p2));// "-1" // c пакуется, а поля копируются в p2 p2 = (MyPoint)c; // Убеждаемся, что поля скопированы в p2 Console.WriteLine(p2.ToString());// "(10, 10)" }