C# разница между Array и int[]

Скажите в чем отличие между

int[] mass = new int[2] {1,2}
Array mass = new int[2] {1,2}

почему я не могу по индексу обращаться к элементам массива типа array?


Ответы (1 шт):

Автор решения: aepot

Вот смотрите.

mass - это ссылка на объект, так как массив - это ссылочный тип.

int[] mass = new int[2] {1, 2};

порождает ссылку, которая в памяти выглядит как:

int[] mass ---> int[]

То есть ссылка mass имеет тип int[] и ссылается на объект типа int[].

Array mass = new int[2] {1, 2};

порождает ссылку, которая в памяти выглядит как:

Array mass ---> int[]

То есть в памяти будет все равно int[], но ссылка будет иметь тип родителя Array, и в коде вы сможете с объектом работать только как с Array.

Можно даже так

object mass = new int[2] {1, 2};
object mass ---> int[]

У вас будет mass, но вы вообще не сможете обращаться к данным массива.

Но ситуация в обоих случаях с Array и object не безнадежная, так как можно сделать вот так:

int[] m = (int[])mass;

И получить

int[] m ---> int[]

Даже если mass был object. Главное, что он ссылается на объект нужного типа. Если объект, на который ссылается переменная-ссылка неподходящего типа, то вы при касте получите исключение InvalidCastException.

  • Приведение ссылки к типу одного из родителей называется апкаст (upcast). То есть каст по иерархии наследования вверх.
  • Приведение ссылки к дочернему типу называется даункаст (downcast). То есть каст по иерархии наследования вниз.

Преобразование типов в C#

→ Ссылка