web-dev-qa-db-ja.com

string.Format()の引数として配列を使用する

string.Format()メソッドの引数として配列を使用しようとすると、次のエラーが表示されます。

FormatException:インデックス(ゼロベース)は、ゼロ以上で引数リストのサイズ未満でなければなりません。

コードは次のとおりです。

_place = new int[] { 1, 2, 3, 4};
infoText.text = string.Format("Player1: {0} \n Player2: {1} \n Player3: {2} \n Player4: {3}", place);
_

配列には4つの値が含まれ、String.Format()の引数も同じです。

このエラーの原因は何ですか?

(_infoText.text_は単なる通常のStringオブジェクトです)

15
martin36

Int配列を渡すときに文字列配列に変換できます。

infoText.text = string.Format("Player1: {0} \n Player2: {1} \n Player3: {2} \n Player4: {3}", 
                              place.Select(x=>x.ToString()).ToArray());

クイックフィックス。

var place = new object[] { 1, 2, 3, 4 };

C#はint[]からobject[]への共変配列変換をサポートしないため、配列全体がobjectと見なされるため、単一のパラメーターで このオーバーロード が呼び出されます。

8
M.kazem Akhgary

params引数に明示的な配列を渡すことは可能ですが、一致するタイプが必要です。 string.Formatにはいくつかのオーバーロードがありますが、次の2つは興味深いものです。

string.Format(string, params object[])
string.Format(string, object)

int[]を暗黙的に(または明示的に)int[]に変換できないため、object[]objectとして扱うことが唯一の機能する変換です。したがって、string.Formatには4つのプレースホルダーがありますが、引数は1つだけです。正しい型の配列を宣言する必要があります

var place = new object[] {1,2,3,4};
6
Joey

他の人がすでに言っているように、_int[]_を_object[]_に変換することはできません。ただし、Enumerable.Cast<T>()を使用してこの問題を修正できます。

_infoText.text = string.Format
(
      "Player1: {0} \n Player2: {1} \n Player3: {2} \n Player4: {3}",                        
      place.Cast<object>().ToArray()
);
_

ところで、C#6以降を使用している場合は、_string.Format_の代わりに補間された文字列を使用することを検討してください。

_infoText.text = $"Player1: {place[0]}\n Player 2: {place[1]} \n Player 3: {place[2]} \n Player 4: {place[3]}";
_
3