Я, думаю, Вы что-то не так поняли. Массив, это ссылочный тип и в случае
var a = new int[1] {5}
значение переменной
a
будет лежать в стеке, но значением будет ссылка на место в куче, указывающая на массив интов. Тоже самое касается и
a = new object[1] {5}
Упаковка будет происходить со значениями, которые лежат в стеке, а потом копируются в кучу. Например так
int a = 5;
var b = (object)a;
В первой строке мы положили в стек пятерку, а во второй эту пятерку мы помещаем в кучу. Переменная
b
будет лежать в стеке, значение которой будет указывать на адрес в куче, где лежит тип
object
, со значением
value
равным 5. И то, что у объекта поле будет интовое, не означает, что оно будет в стеке.