Разопаковане на масив в аргументи на метода

Както знаете, C# поддържа различни методи чрез ключовата дума params:

int Add(params int[] xs) {
    return xs.Sum();
}

Което след това може да бъде извикано с произволен брой аргументи, които желаете:

Add(1);
Add(1, 2);
Add(1, 2, 3);

Но да кажем, че искам да извикам Add с помощта на масив от ints1. Възможно ли е това и как (за предпочитане без размисъл)? Опитах следното, но те дадоха синтактични грешки (синтаксисът беше чисто предположение):

var xs = new[] { 1, 2, 3 };
Add(xs...); // doesn't work; syntax error
Add(params xs); // doesn't work; syntax error

1 Действителният ми случай на употреба е различен, но реших, че този пример ще бъде по-малко сложен.


person Community    schedule 20.02.2013    source източник
comment
Какво имаш предвид под не работи?   -  person antonijn    schedule 20.02.2013
comment
Синтактична грешка на @Antonijn.   -  person    schedule 20.02.2013
comment
stackoverflow.com/questions/36350/ Тази нишка казва, че трябва да работи. Възможно ли е опростяването да крие нещо?   -  person Blast_dan    schedule 20.02.2013
comment
Можете ли да определите не работи? Получавате ли грешка по време на компилиране, грешка по време на изпълнение или неочакван изход?   -  person Jordan Parmer    schedule 20.02.2013
comment
Връщате нещо в метод, който не връща нищо (void)   -  person DROP TABLE users    schedule 20.02.2013
comment
Вашият пример е невалиден, защото всъщност можете да извикате Add метод с масив от int.   -  person Ryszard Dżegan    schedule 20.02.2013
comment
Вие дефинирахте своя метод void и искате ли да върнете int?   -  person Soner Gönül    schedule 20.02.2013


Отговори (5)


Вашият метод се нуждае от тип връщане:

int Add(params int[] xs) {
    return xs.Sum();
}

И за да го извикате с масив, просто използвате обикновения синтаксис за извиквания на метод:

int[] xs = new[] { 1, 2, 3 };
var result = Add(xs);
person Mark Byers    schedule 20.02.2013
comment
Какво ще се случи, ако Add вземе object[]? Всеки тип може да се преобразува в object, така че няма ли да е двусмислено? - person ; 20.02.2013
comment
всъщност трябва да хвърлите вътрешните обекти. можете да опитате var xsAsObjcet = xs.ToList.Cast‹object›().ToArray; - person Blast_dan; 20.02.2013

Ключовата дума params основно ви позволява да се възползвате от малко синтактична захар. Той казва на компилатора, че когато види

Add(1, 2, 3);

Трябва да преобразува това в

Add(new int[] { 1, 2, 3});

Така че, за да направите това от вашия код, не е нужно да правите нищо специално.

 int[] parameters = new int[] { ... }
 results = Add(parameters);

Вижте документацията за повече подробности.

person p.s.w.g    schedule 20.02.2013
comment
използвайте @params за име на променлива, което е C# ключова дума. Това няма да се компилира - person Ilya Ivanov; 20.02.2013

Доколкото знам, можете просто да го извикате с масив, както бихте направили нормален метод:

Add(xs);

Нищо изискано, без ключова дума params при извикването на метода, без точки.

person antonijn    schedule 20.02.2013

static void Main(string[] args)
{
    int[] tmp =  {1, 2};
    var sum = Add(tmp);
}
public static int Add(params int[] xs)
{
    return xs.Sum();
}

Трябва да работи добре..

person Evelie    schedule 20.02.2013

Ако е нещо като Java, можете просто да извикате метода с масива като аргумент.

Тази функция е и това, което прави vararg опасни, особено ако един от типовете vararg също е масив...

person Svend Hansen    schedule 20.02.2013