- foo не может использовать ref / out /% и никакие дополнительные параметры.
- фактический параметр foo должен быть Object ^.
Вызывающий может выделить массив и передать его, и вы можете изменить элементы в массиве - но это просто приведение массива к Object и обратно.
Если вы хотите изменить фактический массив - например, назначить его новому массиву другой длины, без использования ref
(%
в C ++ / CLI) или out
([Out]
в C ++ / CLI) , ты не сможешь это сделать.
И вот почему:
. Виртуальная машина .NET работает, помещая вещи в стек. То, как вы передаете параметры в функции, работает за кадром:
- Вы помещаете параметры (в данном случае, ссылку на массив) в стек.
- Вы вызываете функцию
- ВМ настраивается для вызова метода, считывая эти значения из стека в указанном порядке и присваивая их локальным переменным в вашей функции.
- Код внутри функции выполняется.
Если вызывающая сторона не помещает действительные данные в стек до вызова функции, происходит сбой. Если вызывающая сторона помещает данные в неправильном порядке - происходит сбой. Если что-нибудь смешно со стеком - он вылетает.
Кроме того, методы не могут изменять вещи, которые уже находятся в стеке. (Если бы они это сделали, они бы испортили стек - он рушится), они могут только вставлять и извлекать новые вещи из стека.
Это означает 2 вещи:
Чтобы вызвать функцию, вы должны поместить ссылку на массив в стек. Поэтому вызывающая сторона должна выделить сам массив или передать нулевую ссылку.
Вы не можете изменить ссылку на массив, поэтому функция не может предоставить новый массив. Поскольку массивы по своей природе не могут быть изменены, это означает, что вы не можете добавлять новые элементы (однако вы можете изменять существующие элементы)
Отказ от ответственности: Эрик Липперт, вероятно, придет и объяснит, почему все, что я только что написал, неверно, но, насколько мне известно, это то, как это работает