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)"
        }