C# 将数组作为'params'参数传递

C# 将数组作为'params'参数传递,c#,.net,params,C#,.net,Params,我有以下方法: void MyMethod(params object[] args) { } 我正试图使用类型为object[]的参数调用它: object[] myArgs = GetArgs(); MyMethod(myArgs); 它编译得很好,但是在MyMethodIargs=={myArgs}内部,即一个数组,其中一个元素是我的原始参数。显然,我想要的是args=myArgs,我做错了什么 编辑: Jon Skeet实际上是对的,GetArgs()确实将它包装在一个元素数组中,很

我有以下方法:

void MyMethod(params object[] args)
{
}
我正试图使用类型为
object[]
的参数调用它:

object[] myArgs = GetArgs();
MyMethod(myArgs);
它编译得很好,但是在
MyMethod
I
args=={myArgs}
内部,即一个数组,其中一个元素是我的原始参数。显然,我想要的是
args=myArgs
,我做错了什么

编辑:

Jon Skeet实际上是对的,
GetArgs()
确实将它包装在一个元素数组中,很抱歉这个愚蠢的问题。

您所描述的根本没有发生。除非需要,否则编译器不会创建包装器数组。下面是一个简短但完整的程序,演示了这一点:

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(新对象[]{args})

“但是在mymethodi args=={myArgs}”这意味着什么?为什么不显示该代码?@TimSchmelter,它的意思是:即一个数组,其中一个元素是我的原始参数。
object[]
的问题也是
object
)@Grzenio:我的问题仍然没有答案,为什么不在方法中显示代码?@Hans:不,这完全不正常。事实并非如此。编译器不需要创建数组时不会创建数组。
MyMethod(新的int[]{1,2,3})
打印
1
,所以它可能不是对象[]数组。@Dirk:是的,因为
int[]
不是
对象[]
。它必须把它包起来。OP的代码并不是这样显示的,
myArgs
的编译时类型是
object[]
,而不是
int[]
@Dirk是的,这是因为int是一种值类型,因此不能用作对象array@All我认为德克理解这种区别,他只是简单地提出了一个可能的原因,为什么OPs代码没有按照tin上的说明执行。@Jon你是天才。我不知道一个人怎么能获得这么多知识。