Lorsque j'essaie d'utiliser un tableau comme argument pour la méthode string.Format()
, j'obtiens l'erreur suivante:
FormatException: L'index (basé sur zéro) doit être supérieur ou égal à zéro et inférieur à la taille de la liste d'arguments.
Le code est comme suit:
place = new int[] { 1, 2, 3, 4};
infoText.text = string.Format("Player1: {0} \n Player2: {1} \n Player3: {2} \n Player4: {3}", place);
Le tableau contient quatre valeurs et les arguments de la String.Format()
sont également les mêmes.
Qu'est-ce qui cause cette erreur?
(Le infoText.text
Est juste un objet String normal)
Vous pouvez convertir un tableau int en tableau de chaînes en le passant.
infoText.text = string.Format("Player1: {0} \n Player2: {1} \n Player3: {2} \n Player4: {3}",
place.Select(x=>x.ToString()).ToArray());
Solution rapide.
var place = new object[] { 1, 2, 3, 4 };
C # ne prend pas en charge la conversion de tableau de co-variantes à partir de int[]
à object[]
donc le tableau entier est considéré comme object
, donc cette surcharge avec un seul paramètre est appelé.
Il est possible de passer un tableau explicite pour un argument params
, mais il doit avoir le type correspondant. string.Format
a quelques surcharges, dont les deux suivantes nous intéressent:
string.Format(string, params object[])
string.Format(string, object)
Dans votre cas, traiter le int[]
as object
est la seule conversion qui fonctionne, car un int[]
ne peut pas être implicitement (ou explicitement) converti en object[]
, alors string.Format
voit quatre espaces réservés, mais un seul argument. Vous devez déclarer votre tableau du bon type
var place = new object[] {1,2,3,4};
Comme d'autres l'ont déjà dit, vous ne pouvez pas convertir int[]
En object[]
. Mais vous pouvez résoudre ce problème en utilisant Enumerable.Cast<T>()
:
infoText.text = string.Format
(
"Player1: {0} \n Player2: {1} \n Player3: {2} \n Player4: {3}",
place.Cast<object>().ToArray()
);
BTW, si vous êtes sur C # 6 ou supérieur, vous pourriez envisager d'utiliser des chaînes interpolées au lieu de string.Format
:
infoText.text = $"Player1: {place[0]}\n Player 2: {place[1]} \n Player 3: {place[2]} \n Player 4: {place[3]}";