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