2014-02-11 107 views
4

我有以下方法:傳遞數組作爲`params`參數

void MyMethod(params object[] args) 
{ 
} 

其中我試圖與object[]類型的參數來調用:

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

它編譯很好,但內部MyMethodargs == { myArgs},即一個數組是我的原始參數。顯然我想要args = myArgs,我做錯了什麼?

編輯:
喬恩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); 
    } 
} 

根據你的問題,這將打印1 - 但它不,它打印3. args值直接傳遞給MyMethod,沒有進一步擴大。

您的代碼不是您發佈的代碼,或者是「包裝」發生在GetArgs之內。

你可以強制它包裝鑄造argsobject。例如,如果我改變的Main到最後一行:

MyMethod((object) args); 

... 然後它打印1,因爲它有效地調用MyMethod(new object[] { args })

+0

'MyMethod(new int [] {1,2,3})'打印'1',所以它可能不是一個object []數組。 – Dirk

+2

@Dirk:是的,因爲int []不是'object []'。它必須包裝它。這不是OP的代碼所顯示的 - myArgs的編譯時類型是object [],而不是int []。 –

+0

@Dirk是的,這是因爲int是一個值類型,因此不能用作對象數組 – Georg