How to pass a single object[] to a params object[]

前端 未结 7 1433
有刺的猬
有刺的猬 2020-11-27 15:43

I have a method which takes params object[] such as:

void Foo(params object[] items)
{
    Console.WriteLine(items[0]);
}

When I pass two o

相关标签:
7条回答
  • 2020-11-27 15:55

    You need to encapsulate it into another object[] array, like this:

    Foo(new Object[] { new object[]{ (object)"1", (object)"2" }});
    
    0 讨论(0)
  • 2020-11-27 16:00
    new[] { (object) 0, (object) null, (object) false }
    
    0 讨论(0)
  • 2020-11-27 16:05

    The params parameter modifier gives callers a shortcut syntax for passing multiple arguments to a method. There are two ways to call a method with a params parameter:

    1) Calling with an array of the parameter type, in which case the params keyword has no effect and the array is passed directly to the method:

    object[] array = new[] { "1", "2" };
    
    // Foo receives the 'array' argument directly.
    Foo( array );
    

    2) Or, calling with an extended list of arguments, in which case the compiler will automatically wrap the list of arguments in a temporary array and pass that to the method:

    // Foo receives a temporary array containing the list of arguments.
    Foo( "1", "2" );
    
    // This is equivalent to:
    object[] temp = new[] { "1", "2" );
    Foo( temp );
    


    In order to pass in an object array to a method with a "params object[]" parameter, you can either:

    1) Create a wrapper array manually and pass that directly to the method, as mentioned by lassevk:

    Foo( new object[] { array } );  // Equivalent to calling convention 1.
    

    2) Or, cast the argument to object, as mentioned by Adam, in which case the compiler will create the wrapper array for you:

    Foo( (object)array );  // Equivalent to calling convention 2.
    


    However, if the goal of the method is to process multiple object arrays, it may be easier to declare it with an explicit "params object[][]" parameter. This would allow you to pass multiple arrays as arguments:

    void Foo( params object[][] arrays ) {
      foreach( object[] array in arrays ) {
        // process array
      }
    }
    
    ...
    Foo( new[] { "1", "2" }, new[] { "3", "4" } );
    
    // Equivalent to:
    object[][] arrays = new[] {
      new[] { "1", "2" },
      new[] { "3", "4" }
    };
    Foo( arrays );
    

    Edit: Raymond Chen describes this behavior and how it relates to the C# specification in a new post.

    0 讨论(0)
  • 2020-11-27 16:06

    A simple typecast will ensure the compiler knows what you mean in this case.

    Foo((object)new object[]{ (object)"1", (object)"2" }));
    

    As an array is a subtype of object, this all works out. Bit of an odd solution though, I'll agree.

    0 讨论(0)
  • 2020-11-27 16:09

    Another way to solve this problem (it's not so good practice but looks beauty):

    static class Helper
    {
        public static object AsSingleParam(this object[] arg)
        {
           return (object)arg;
        }
    }
    

    Usage:

    f(new object[] { 1, 2, 3 }.AsSingleParam());
    
    0 讨论(0)
  • 2020-11-27 16:10

    This is a one line solution involving LINQ.

    var elements = new String[] { "1", "2", "3" };
    Foo(elements.Cast<object>().ToArray())
    
    0 讨论(0)
提交回复
热议问题