2014-02-11 4 views
4

나는 다음과 같은 방법이 있습니다params` 인수`로 배열을 전달

void MyMethod(params object[] args) 
{ 
} 

I 유형 object[]의 매개 변수를 호출하는 것을 시도하고있다 :

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

그것은 잘 컴파일하지만 내부 MyMethod I args == { myArgs}, 즉 원래 요소 인 하나의 요소가있는 배열. 분명히 args = myArgs을 갖고 싶었는데, 내가 뭘 잘못하고 있니?

편집 :
Jon Skeet이 실제로 맞았습니다. GetArgs()은 일 구성 요소 배열에있는 내용을 포장했습니다. 어리석은 질문에 사과드립니다.

+1

_ "하지만 MyMethod 내부에서 나는 args == {myArgs}"_이게 무슨 뜻입니까? 왜 그 코드를 보여주지 않습니까? –

+0

@TimSchmelter, 즉, 원래의 인수 인 요소가 하나있는 배열입니다. – Grzenio

+0

문제는'object []'도'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); 
    } 
} 

질문에 따르면,이 일을 인쇄 할 것이다 - 그러나, 그것은 더 이상의 확장을, args의 값은 MyMethod에 직접 전달 3. 인쇄하지 않습니다 .

게시 한 코드가 아니거나 "포장"이 GetArgs 이내에 발생합니다.

args에서 object으로 캐스팅하여 포장 할 수 있습니다. 효과적으로 MyMethod(new object[] { args })를 호출 있기 때문에, 다음은 1을 인쇄

MyMethod((object) args); 

... 예를 들어, 나는 Main의 마지막 줄을 변경합니다.

+0

'MyMethod (new int [] {1,2,3})'는'1'을 출력하므로 객체 배열이 아닐 수도있다. – Dirk

+2

@Dirk : 네, 왜냐하면'int []'는'object []'가 아니기 때문입니다. 그것을 포장해야합니다. 이것은 OP의 코드가 보여주는 것이 아닙니다. 컴파일 타임 타입의 myArgs는 int []가 아닌'object []'입니다. –

+0

@Dirk 그렇습니다. int는 값 유형이므로 객체 배열로 사용할 수 없기 때문에입니다. – Georg