Когда создается объект $ arr, поскольку он не был определен как массив int [int []], он был создан как [массив]. При передаче в функцию первоначально до добавления [int []]. Он передал ссылку и изменил данные. Если бы вы добавили объект дополнения к массиву, он бы ничего не возвратил, так как это создало бы новый объект массива.
Когда вы добавили [int []] к параметру, он создал новый объект int array [int []] с именем $ a и изменил там данные. Поскольку $ a никогда не возвращается, переменная уничтожается в конце функции.
Если бы вы передали массив int, он бы манипулировал этим массивом.
Давайте рассмотрим несколько примеров
Это изменит первое значение с индексом 0 на 5. Поскольку ни один объект не был добавлен в массив, а массив может быть любым объектом в параметре, он позволил изменить ссылку на индекс 0 вместо того, чтобы нуждался в новом объекте. подлежит возврату
function TestFunction($a)
{
$a[0] = 5
}
$TestVar = @(2,3,1)
TestFunction -a $TestVar
$TestVar
output 5,3,1
Поскольку объект orignal имеет тип Array, а параметр имеет тип int array. функция создаст новый массив int на основе входного массива. Так как функция должна возвращать новый массив int и возврата нет, сборщик мусора будет.
function TestFunction([int[]]$a)
{
$a[0] = 4
}
$TestVar = @(2,3,1)
TestFunction -a $TestVar
$TestVar
Так что в вашем случае мы можем сделать
function TestFunction([int[]]$a)
{
$a[0] = 4
}
[int[]]$TestVar = @(2,3,1)
TestFunction -a $TestVar
$TestVar
поскольку параметр ищет массив int, а входные данные являются массивом int, а новые объекты не добавляются и не вычитаются из массива, это приведет к правильному изменению значения.