将数组传递给函数,该函数接受参数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[]或IEnumerable<T>

如果传递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());