Вы создаете новый массив, копируете в него существующие параметры, добавляете другие элементы и вызываете другой метод с большим массивом
Это, когда все сказано и сделано, просто массивы. params
просто означает, что компилятор позволяет вам указывать аргументы индивидуально, и он превратит их в массив для вас.
Вы пишете это:
MyFuncWithParamsObjectArg(1,2,3,4,5);
Компилятор концептуально изменяет его на:
MyFuncWithParamsObjectArg(new object [] {1,2,3,4,5} );
Вот демонстрационная программа:
public static void Main()
{
A("z", "y");
}
static void A(params object[] a){
Console.WriteLine("In A()");
foreach(object o in a)
Console.WriteLine(o);
object[] oo = new object[a.Length + 2];
for(int i = 0; i < a.Length; i++)
oo[i] = a[i];
oo[a.Length] = "new";
oo[a.Length + 1] = "new2";
B(oo);
}
static void B(params object[] b){
Console.WriteLine("In B()");
foreach(object o in b)
Console.WriteLine(o);
}
Распечатывает это:
In A()
z
y
In B()
z
y
new
new2
Вы можете видеть, что B был вызван с массивом на 2 длиннее, чем a, и добавлены еще два элемента
Обратите внимание, вы не можете «расширить» массив, независимо от того, являются ли он параметрами или нет. Вы должны создать новый массив, скопировать его и go оттуда
Если вы хотите обернуть его так, чтобы вы не сглаживали первый массив, а вместо этого создавали другие параметры массив, который имеет первый массив в качестве одного из элементов:
static void A(params object[] a){
Console.WriteLine("In A()");
foreach(object o in a)
Console.WriteLine(o);
B(a, "new1", "new2");
}
B теперь получит массив, который выглядит следующим образом:
object[] {
object[] { "z", "y" },
"new1",
"new2"
}
Как отмечалось; нет magi c - компилятор смотрит на то, что вы предоставили, и если аргументы совпадают с "вызванным с помощью одномерного массива", он вызывает функцию с массивом, в противном случае он собирает различные аргументы, превращает их в массив , и вызывает его с этим массивом
B(a); //a is already an object array, it is passed in verbatim
B(a, "new1", "new2"); //a new object array is created from these 3 objects
B(new object[] {a, "new1", "new2"} ); //manually doing what the compiler does for you above