.net 将数组作为`params`参数传递

mhd8tkvw  于 2023-05-23  发布在  .NET
关注(0)|答案(2)|浏览(291)

我有以下方法:

void MyMethod(params object[] args)
{
}

我尝试使用object[]类型的参数调用它:

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

它编译得很好,但在MyMethod I args == { myArgs}内部,即一个数组,其中一个元素是我的原始参数。显然我想要args = myArgs,我做错了什么?
编辑:
Jon Skeet实际上是对的,GetArgs()确实把东西 Package 在一个元素数组中,抱歉问了个愚蠢的问题。

wfveoks0

wfveoks01#

你所描述的根本没有发生。编译器不会 * 创建 Package 器数组,除非它需要。这里有一个简短但完整的程序来演示这一点:

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,没有进一步的扩展。
要么你的代码不是你发布的那样,要么“ Package ”发生在GetArgs中。
你可以通过将args转换为object来强制它换行。例如,如果我将Main的最后一行更改为:

MyMethod((object) args);

... * 然后 * 它打印1,因为它实际上调用了MyMethod(new object[] { args })

yi0zb3m4

yi0zb3m42#

以下转换对我有效:

void Foo(params object[] args)
{
  foreach (var arg in args) 
    Console.WriteLine(arg.ToString());
}

var integers = new int[]{1,2,3,4};
Foo(integers.Cast<object>().ToArray());

相关问题