我有一个方法,它采用params object [],如:
void Foo(params object[] items) { Console.WriteLine(items[0]); }
当我将两个对象数组传递给此方法时,它可以正常工作:
Foo(new object[]{ (object)"1", (object)"2" }, new object[]{ (object)"3", (object)"4" } ); // Output: System.Object[]
但是,当我传递一个对象[]时,它不会将我的对象[]作为第一个参数,而是将所有元素视为我想要逐个传递它们:
Foo(new object[]{ (object)"1", (object)"2" }); // Output: 1, expected: System.Object[]
如何将单个对象[]作为第一个参数传递给params数组?
一个简单的类型转换将确保编译器在这种情况下知道你的意思.
Foo((object)new object[]{ (object)"1", (object)"2" }));
由于数组是对象的子类型,所以这一切都可以解决.虽然有点奇怪的解决方案,但我同意.
该params
参数修改给呼叫者传递多个参数的方法的快捷语法.使用params
参数调用方法有两种方法:
1)使用参数类型的数组调用,在这种情况下,params
关键字无效,数组直接传递给方法:
object[] array = new[] { "1", "2" }; // Foo receives the 'array' argument directly. Foo( array );
2)或者,使用扩展的参数列表调用,在这种情况下,编译器将自动将参数列表包装在临时数组中并将其传递给方法:
// Foo receives a temporary array containing the list of arguments. Foo( "1", "2" ); // This is equivalent to: object[] temp = new[] { "1", "2" ); Foo( temp );
为了将对象数组传递给带有" params object[]
"参数的方法,您可以:
1)手动创建一个包装器数组并将其直接传递给方法,如lassevk所述:
Foo( new object[] { array } ); // Equivalent to calling convention 1.
2)或者,object
如Adam所述,将参数转换为,在这种情况下,编译器将为您创建包装器数组:
Foo( (object)array ); // Equivalent to calling convention 2.
但是,如果方法的目标是处理多个对象数组,则使用显式" params object[][]
"参数声明它可能更容易.这将允许您将多个数组作为参数传递:
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 );
编辑: Raymond Chen在新帖子中描述了这种行为以及它与C#规范的关系.
这是一个涉及LINQ的单行解决方案.
var elements = new String[] { "1", "2", "3" }; Foo(elements.Cast