web-dev-qa-db-fra.com

Utilisation d'un tableau comme argument pour string.Format ()

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)

15
martin36

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é.

8
M.kazem Akhgary

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};
6
Joey

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]}";
3