将数组传递给params object []或IEnumerable <T>的函数

bou*_*err 20 c# arrays string overloading enumerable

我想将一个自定义对象数组传递给一个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);
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误:

以下方法或属性之间的调用不明确:'string.Join(string,params object [])'和'string.Join(string,System.Collections.Generic.IEnumerable)'

我可以通过使用IEnumerable<T>函数来解决歧义:

var arr = new MyClass[]{ new MyClass(), new MyClass() };
string text = string.Join<MyClass>("\n", arr);
Run Code Online (Sandbox Code Playgroud)

但是我可以调用该params object[]函数吗?在性能关键的情况下,最好是直接访问数组而不是通过枚举器.

我正在使用C#4.0,如果这有任何区别.

cdh*_*wie 27

如果传递a object[]作为第二个参数,编译器应该选择object[]重载,因为它完全匹配.如果你有一个不同类型的数组(MyClass[]在这种情况下),只需将数组转换为object[]:

string.Join("\n", (object[])arr);
Run Code Online (Sandbox Code Playgroud)

实际上,您并未实际更改任何对象的类型或在运行时执行任何转换,您只需向编译器提供有关使用哪个重载的提示.

关于您对性能的评论,如果性能至关重要,请不要忘记对这两个选项进行基准测试.不要以为一个比另一个快.(并且始终对您的整个应用程序进行概述 - 任何瓶颈都可能出现在其他地方.)