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

Как вы знаете, 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, вы можете просто вызвать метод с массивом в качестве аргумента.

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

person Svend Hansen    schedule 20.02.2013