将数组传递给函数,该函数接受参数object[]或IEnumerable
本文关键字:函数 object IEnumerable 参数 数组 | 更新日期: 2023-09-27 18:08:25
我想将一个自定义对象数组传递给一个函数,如String.Join
,它具有以下签名:
-
public static string Join(string separator, params Object[] values)
-
public static string Join(string separator, IEnumerable<T> values)
如果我像这样调用函数:
var arr = new MyClass[]{ new MyClass(), new MyClass() };
string text = string.Join("'n", arr);
我得到一个编译错误:
调用在以下方法或属性之间是二义性的:连接(字符串,参数对象[])'和'字符串。加入(字符串,System.Collections.Generic.IEnumerable)
我可以通过使用IEnumerable<T>
函数来解决歧义:
var arr = new MyClass[]{ new MyClass(), new MyClass() };
string text = string.Join<MyClass>("'n", arr);
但是我可以调用params object[]
函数吗?
我用的是c# 4.0,如果这有什么区别的话
如果传递object[]
作为第二个参数,编译器应该选择object[]
重载,因为它完全匹配。如果您有不同类型的数组(本例中为MyClass[]
),只需将数组强制转换为object[]
:
string.Join("'n", (object[])arr);
你实际上并没有改变任何对象的类型或在运行时执行任何转换,你只是给编译器一个关于使用哪个重载的提示。
关于你对性能的评论,如果性能如此重要,不要忘记对这两个选项进行基准测试。不要假设其中一个比另一个快。(并且始终对整个应用程序进行概要分析——任何瓶颈都可能出现在其他地方。)
如果您将arr
变量的类型更改为object[]
,则将调用另一个重载:
object[] arr = new MyClass[] { new MyClass(), new MyClass() };
string text = string.Join("'n", arr);
您也可以显式地将其强制转换为object[]
: string。加入("' n"(object []) arr);
最简单的代码修改是:
var arr = new MyClass[]{ new MyClass(), new MyClass() };
string text = string.Join("'n", arr);
:
var arr = new object[]{ new MyClass(), new MyClass() };
string text = string.Join("'n", arr);
如前所述,强制转换也可以工作:
var arr = new MyClass[]{ new MyClass(), new MyClass() };
string text = string.Join("'n", (object[])arr);
要了解有关此主题的更多信息,请研究c#重载解析。
重载解析本身就是一个有趣的主题,但我还没有发现它是性能问题的瓶颈。
如果你使用的是IEnumerable
,你可以使用ToArray()
方法的<object>
泛型重载:
var allFoos = foo.GetAllFoos().ToArray<object>();
string s = string.Join(", ", allFoos);
看起来不那么臃肿,更容易读
你可以像这样调用另一个重载(这就是param的作用)-
string text = string.Join("'n", new MyClass(), new MyClass());