Я изучаю С# и пытаюсь понять его "ориентированные на тип" аспекты.
Итак, на днях мне нужно было получить объект System.Array из метода. Затем я попытался работать с ним с отдельными объектами, поэтому я попытался обратиться к нему с индексом. Компилятор не позволил мне сказать, что объект System.Array не поддерживает индексирование.
Но не является ли Array базовым классом для всех массивов (System.Array на msdn)? Как этот int [] поддерживает индексирование, а Array [] не работает?
вот какой код для демонстрации проблемы:
int[] intArray = {1,2,3,4,5,6,7,8,9,10};
int t;
Array sysArray;
Console.WriteLine("{0}", intArray.GetType().ToString()); // output: System.Int32[]
sysArray = Array.CreateInstance(typeof(int), 10);
Console.WriteLine("{0}", sysArray.GetType().ToString()); // output: System.Int32[]
sysArray = intArray; //compiles ok
//t = sysArray[4]; This line produces error Error 2 Cannot apply indexing with [] to an
// expression of type 'System.Array'
//t = intArray[4]; This line compiles ok
Итак, у нас есть 2 объекта, которые, похоже, одного типа. Но один реализует индексирование, а другой - нет, как это возможно?
ссылка на ответы
прочитав ваши комментарии, я думаю, что у меня есть смысл. int [] и массив объектов. каждый из объектов является структурой типа int32. Массив [] - массив объектов. каждый из объектов является классом типа Array. значение: массив массивов. как я могу отобразить в следующем коде:
Array[] sysArrayOfArray = new Array[SIZE_OF_THE_MOTHER_ARRAY];
sysArrayOfArray[0] = Array.CreateInstance(typeof(int),SIZE_OF_FIRST_CHILD_ARRAY);
sysArrayOfArray[1] = Array.CreateInstance(typeof(int),SIZE_OF_FIRST_SECOND_ARRAY);
и так далее... поэтому я понял, почему способ, которым я пытался получить доступ к элементам sysArray, был неправильным. intArray → 1 массив из многих ints sysArray → 1 класс (который предоставляет доступ ко многим ints)
с точки зрения языка sysArray вообще не является массивом, это всего лишь ссылка на 1 объект (типа System.Array)
(извините за повторение бит, но это действительно помогает установить что-то в моей голове)
Благодарю всех вас за руководство в понимании этой разницы.
относительно решений.. что я искал и работал у меня лучше всего:
Array sysArray = Array.CreateInstance(typeof(int),3);
int[] intArray = new int[3];
int one, ten, hundred;
sysArray.SetValue(1, 0);
sysArray.SetValue(10,1);
sysArray.SetValue(100,2);
intArray = (int[])sysArray;// works, but forces me to create a new reference
one = ((int[])sysArray)[0];// works and is exactly what i was looking for...
ten = ((int[])sysArray)[1];
hundred = ((int[])sysArray)[2];