2013-02-20 4 views
3

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

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

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

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

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

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

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

+0

Что вы имеете в виду не работает? – antonijn

+0

@ Ошибка синтаксиса. – 2013-02-20 15:29:05

+0

http://stackoverflow.com/questions/36350/how-to-pass-a-single-object-to-a-params-object В этой ветке говорится, что она должна работать. Может ли упрощение что-то скрывать? –

ответ

9

Ваш метод требует типа возвращаемого значения:

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

И назвать это с массивом вы просто использовать обычный синтаксис для вызовов методы:

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

+1 для ответа на один из самых сложных вопросов по SO .. –

+0

Что произойдет, если 'Add' принимает' object [] '? Любой тип конвертируется в 'object', так что бы это не было двусмысленным? – 2013-02-20 15:31:00

+0

вам действительно нужно отбросить внутренние объекты. Вы можете попробовать var xsAsObjcet = xs.ToList.Cast () .ToArray; –

0

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

Add(xs); 

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

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

Должен работать нормально ..

2

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

Add(1, 2, 3); 

Он должен преобразовать что

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

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

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

См. the documentation для получения более подробной информации.

+1

использовать '@ params' для имени переменной, которое является ключевым словом C#. Это не будет компилировать –

+0

@IlyaIvanov благодарит. исправлено –

0

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

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