Только массивы ссылочных типов (например, String
) могут быть назначены массивам других ссылочных типов (например, Object
).Поскольку int
является типом значения, его массивы не могут быть назначены массивам других типов.
Точнее, это называется ковариация массива .Это работает только тогда, когда битовые комбинации, хранящиеся в массиве, совместимы с типом назначения.Например, все биты в String[]
являются ссылками на строки и могут быть безопасно скопированы в ячейки памяти, где хранятся ссылки на объекты.Массив типов значений, однако, хранит фактические данные элементов (а не просто ссылки на них).Это означает, что int[]
хранит фактические 32-битные целые числа в элементах массива.Поскольку 32-разрядное целое число нельзя безопасно скопировать в область памяти, где хранится ссылка на объект или любой другой тип, вы не можете назначить их массив массиву любого другого типа.
Обратите внимание, что техническибиты int
могут быть безопасно скопированы в ячейку памяти, в которой хранится uint
(и наоборот).Это означает, что вы должны быть в состоянии сделать что-то вроде int[] x = new uint[10]
.На самом деле это не ковариация, и C # не позволяет этого.Однако в CLR это разрешено законом, и вы можете убедить C # позволить вам сделать это, если хотите.