2014-02-11 2 views
4

У меня есть следующий метод:Передача массива в качестве аргумента `params`

void MyMethod(params object[] args) 
{ 
} 

, который я пытаюсь вызвать с параметром типа object[]:

object[] myArgs = GetArgs(); 
MyMethod(myArgs); 

Это компилируется нормально, но внутри MyMethod I args == { myArgs}, т. Е. Массив с одним элементом, который является моими исходными аргументами. Очевидно, я хотел иметь args = myArgs, что я делаю неправильно?

EDIT:
Jon Skeet был на самом деле прав, GetArgs() действительно обернул вещь в массив из одного элемента, извините за глупый вопрос.

+1

_ "но внутри MyMethod I args == {myArgs}" _ Что это значит? Почему бы вам не показать этот код? –

+0

@TimSchmelter, это означает: т. Е. Массив с одним элементом, который является моими исходными аргументами. – Grzenio

+0

Проблема 'object []' is 'object' тоже :) – Tony

ответ

13

То, что вы описали, просто не происходит. Компилятор делает не, создайте массив обертки, если это необходимо. Вот короткая, но полная программа, демонстрирующее это:

using System; 

class Test 
{ 
    static void MyMethod(params object[] args) 
    { 
     Console.WriteLine(args.Length); 
    } 

    static void Main() 
    { 
     object[] args = { "foo", "bar", "baz" }; 
     MyMethod(args); 
    } 
} 

По вашему вопросу, это будет печатать 1 - но это не так, он печатает 3. Значения args передается непосредственно MyMethod, без дальнейшего расширения ,

Либо ваш код не такой, как вы его опубликовали, или «обертывание» происходит в пределах GetArgs.

Вы можете сила обернуть литьем args в object. Например, если изменить последнюю строку Main к:

MyMethod((object) args); 

... затем он печатает 1, потому что это эффективно вызывая MyMethod(new object[] { args }).

+0

'MyMethod (new int [] {1,2,3})' prints '1', так что, возможно, это не массив объектов []. – Dirk

+2

@Dirk: Да, потому что 'int []' не является 'объектом []'. Он должен обернуть его. Это не то, что показывает код OP - тип времени компиляции 'myArgs' -' object [] ', а не' int [] '. –

+0

@Dirk Да, это потому, что int является типом значений и поэтому не может использоваться как массив объектов – Georg

Смежные вопросы