ArrayList
выполняет упаковку для типов значений, но не для ссылочных типов.Вернее, сам по себе ArrayList
не выполняет бокс, а компилятор.Например:
ArrayList list = new ArrayList();
list.Add(5);
фактически
ArrayList list = new ArrayList();
object boxed = 5; // Perform boxing from value type type
list.Add(boxed);
Ваш пример действительно просто приведение - справочное преобразование, а не распаковка.Значение ссылочного типа не нужно помещать в коробку для хранения в ArrayList
- это уже ссылка.
Опять же, это верно для бокса в целом, а не для ArrayList
.Бокс - это просто способ использования значения типа значения, когда вы действительно хотите ссылку ... ссылка должна быть на объект, поэтому CLR создает объект для переноса значения типа значения и возвращаетссылка на эту оболочку («ящик», в котором хранится значение).