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オブジェクトです)
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
と見なされるため、単一のパラメーターで このオーバーロード が呼び出されます。
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};
他の人がすでに言っているように、_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]}";
_