当前位置:  开发笔记 > 编程语言 > 正文

如何将单个对象[]传递给params对象[]

如何解决《如何将单个对象[]传递给params对象[]》经验,为你挑选了3个好方法。

我有一个方法,它采用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数组?



1> Adam Wright..:

一个简单的类型转换将确保编译器在这种情况下知道你的意思.

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

由于数组是对象的子类型,所以这一切都可以解决.虽然有点奇怪的解决方案,但我同意.


鉴于我们已经习惯了其他语言,params的工作方式似乎是不必要的,并且次优的c#设计也是如此。可以使params只接受一种形式,并且可以添加点差式功能,这将使整个语言受益,而不仅仅是这种情况。例如,我们可以强制将所有参数调用都设为Foo(obj [0],obj [1]),然后使用单独的散布运算符允许Foo(... obj)。

2> Emperor XLII..:

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#规范的关系.



3> 小智..:

这是一个涉及LINQ的单行解决方案.

var elements = new String[] { "1", "2", "3" };
Foo(elements.Cast().ToArray())

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有