24

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);

コンパイラ エラーが発生します。

次のメソッドまたはプロパティ間の呼び出しがあいまいです: '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);

しかし、params object[]関数を呼び出すことはできますか?

それが違いを生む場合、私はC#4.0を使用しています。

4

5 に答える 5

32

2 番目のパラメーターとしてan を渡すと、完全に一致object[]するため、コンパイラはobject[]オーバーロードを選択する必要があります。異なる型の配列がある場合 (この場合) は、配列を次MyClass[]のようにキャストするだけです。object[]

string.Join("\n", (object[])arr);

実際にオブジェクトの型を変更したり、実行時に変換を実行したりすることはありません。使用するオーバーロードに関するヒントをコンパイラに与えるだけです。

また、パフォーマンスに関するコメントについては、パフォーマンスが非常に重要な場合は、両方のオプションをベンチマークすることを忘れないでください。一方が他方より速いと仮定しないでください。(そして、常にアプリケーション全体をプロファイリングします。ボトルネックは別の場所にある可能性があります。)

于 2013-04-10T18:33:13.263 に答える
3

arr変数の型をに変更object[]すると、他のオーバーロードが呼び出されます。

object[] arr = new MyClass[] { new MyClass(), new MyClass() };
string text = string.Join("\n", arr);

次のように明示的にキャストすることもできますobject[]: string.Join("\n", (object[])arr);

于 2013-04-10T18:33:44.430 に答える
0

このように他のオーバーロードを呼び出すことができます (これがparamの用途です) -

string text = string.Join("\n", new MyClass(), new MyClass());
于 2013-04-10T18:37:51.523 に答える