【问题标题】:Passing an array as `params` argument将数组作为 `params` 参数传递
【发布时间】:2014-03-09 10:10:57
【问题描述】:

我有以下方法:

void MyMethod(params object[] args)
{
}

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

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

它编译得很好,但在 MyMethod I args == { myArgs} 内部,即一个数组,其中一个元素是我的原始参数。明明我想要args = myArgs,我做错了什么?

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

【问题讨论】:

  • "但在 MyMethod 内部我 args == { myArgs}" 这是什么意思?为什么不显示该代码?
  • @TimSchmelter,这意味着:即一个数组,其中一个元素是我的原始参数。
  • 问题object[] 也是object :)
  • @Grzenio:我的问题仍未得到解答,你为什么不在方法中显示代码?
  • @Hans:不,这根本不完全正常。这不是会发生什么。不需要时编译器不会创建数组。

标签: c# .net params


【解决方案1】:

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

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 })

【讨论】:

  • MyMethod(new int[]{1,2,3}) 打印 1,所以它可能不是 object[] 数组。
  • @Dirk:是的,因为int[] 不是object[]。它必须把它包起来。这不是 OP 的代码所显示的 - myArgs 的编译时类型是 object[],而不是 int[]
  • @Dirk 是的,那是因为 int 是值类型,因此不能用作对象数组
  • @All 我认为 Dirk 理解其中的区别,他只是提出了一个可能的原因,为什么 OPs 代码没有按照它在锡上所说的那样做。
  • @Jon 你是天才。我不知道怎么会有人获得这么多知识。
猜你喜欢
  • 2011-08-12
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 2010-12-18
  • 1970-01-01
相关资源
最近更新 更多