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

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

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

Который затем может быть вызван с любым количеством аргументов, которые вам нравятся:

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

Но сказать, что я хочу позвонить Add используя массив intс1. Возможно ли это и как (желательно без отражения)? Я попробовал следующее, но они дали синтаксические ошибки (синтаксис был просто угадать):

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

1 Фактический вариант использования другой, но я подумал, что этот пример будет менее сложным.

5 ответов

Решение

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

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

И чтобы вызвать его с помощью массива, вы просто используете обычный синтаксис для вызовов методов:

int[] xs = new[] { 1, 2, 3 };
var result = Add(xs);

params Ключевое слово в основном просто позволяет воспользоваться небольшим синтаксическим сахаром. Это говорит компилятору, что когда он видит

Add(1, 2, 3);

Это должно преобразовать это в

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

Таким образом, чтобы сделать это из своего кода, вам не нужно делать ничего особенного.

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

Смотрите документацию для более подробной информации.

Насколько я знаю, вы можете просто вызвать его с массивом, как если бы вы использовали обычный метод:

Add(xs);

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

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

Должно работать просто отлично..

Если это что-то похожее на Java, вы можете просто вызвать метод с массивом в качестве аргумента.

Эта особенность также делает varargs опасным, особенно если один из типов vararg также является массивом...

Другие вопросы по тегам