На этом шаге мы рассмотрим создание и использование таких массивов.
Ранее мы всегда явно или неявно имели в виду, что элементы массива относятся к одному типу. В общем-то, это так. Но бывают и неординарные ситуации. Как мы узнаем немного позже, в языке C# в пространстве имен System есть один особый класс, который называется Object. Его "особенность" связана с тем, что переменная типа Object может ссылаться на значение любого типа. Проще говоря, если объявить переменную и идентификатором типа для нее указать имя класса Object, то значением такой переменной можно присвоить практически все, что угодно.
 
В языке C# существует механизм наследования, который позволяет создавать один класс (производный класс) на основе другого класса (базовый класс). В результате получается иерархия 
классов, связанных наследованием, когда класс создается на основе класса, и на его основе создается еще один класс, и так далее. В наследовании есть важный момент: переменная базового класса 
может ссылаться на объекты, созданные на основе производных классов. Специфика класса Object состоит в том, что он находится в вершине иерархии наследования и любой класс является 
его прямым или косвенным потомком. Поэтому переменная типа Object может ссылаться на любой объект. Более подробно методы работы с классами и объектами, в том числе и механизм 
наследования, буду рассмотрены в последующих шагах. 
Если создать массив из элементов типа Object, то элементам такого массива можно присваивать значения разных типов. В некоторых случаях это бывает удобно и полезно.
 
На практике вместо названия класса Object обычно используют идентификатор object, который является псевдонимом для выражения System.Object.
Небольшой пример, в котором создается и используется массив с элементами типа Object, приведен ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr60_1 { class Program { static void Main() { // Массив из трех переменных типа Object: Object[] objs = new Object[3]; // Элементам массива присваиваются значения // разных типов: objs[0] = 123; // Целое число objs[1] = 'А'; // Символ objs[2] = "Третий элемент"; // Текст Console.WriteLine("Создан такой массив:"); // Проверка содержимого массива: for(int k = 0; k < objs.Length; k++){ Console.WriteLine(k + ": " + objs[k]); } // Новые значения элементов: objs[0] = (int)objs[0] + 111; // Целое число objs[1] = "Bтopой элемент"; // Текст objs[2] = 3.141592; // Действительное число Console.WriteLine("После присваивания значений:"); // Проверка содержимого массива: for(int k = 0; k < objs.Length; k++){ Console.WriteLine(k + ": " + objs[k]); } // Целочисленный массив: int[] nums = {10, 20, 30}; // Переменная массива присваивается как значение // элементу массива: objs[2] = nums; Console.WriteLine("Целочисленный массив:"); // Отображение элементов целочисленного массива: for(int i = 0; i < ((int[])objs[2]).Length; i++){ Console.Write("{0,3}", ((int[])objs[2])[i]); } Console.WriteLine(); // Новое значение элемента в числовом массиве: ((int[])objs[2])[1] = 0; Console.WriteLine("Еще раз тот же массив:"); // Отображение элементов целочисленного массива: for(int i = 0; i < nums.Length; i++){ Console.Write("{0,3}", nums[i]); } Console.WriteLine(); // Задержка: Console.ReadLine(); } } }
Результат выполнения программы будет таким, как показано ниже.

Рис.1. Результат работы приложения
Массив из трех переменных типа Object создается с помощью команды
Object[] objs = new Object[3]; .
objs[0] = 123;
  objs[1] = 'А';
  objs[2] = "Третий элемент";
На следующем этапе элементам массива присваиваются новые значения. Причем тип присваиваемых значений может не совпадать с типом текущего значения элемента. Здесь все просто. Некоторых пояснений требует лишь команда
  objs[0] = (int)objs[0] + 111;              .
После изменения значений элементов массива objs мы опять проверяем содержимое массива (с помощью оператора цикла) и убеждаемся, что изменения вступили в силу.
На следующем этапе командой
  int[] nums = {10, 20, 30};
objs[2] = nums;
objs[2] = nums;
 
Число 3 в инструкции {0,3} в команде 
Console.Write("{0,3}", ((int[])objs[2])[i]);
Убедиться в том, что переменная nums и элемент objs[2] ссылаются на один и тот же массив, достаточно легко. Командой
  ((int[])objs[2])[1] = 0;
На следующем шаге мы рассмотрим параметры командной строки.