Я изучаю C # и пытаюсь понять его «типо-ориентированные» аспекты.
Итак, на днях мне нужно было получить объект 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. значение: массив массивов. как я могу отобразить в следующем коде:
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 массив из множества целых чисел sysArray -> 1 класс (который предоставляет доступ ко многим int)
с точки зрения языка 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];