1
votes

pourquoi comme IEnumerable n'est pas énuméré par une chaîne.

étant donné la méthode d'exécution suivante:

internal static void DefaultShow(object o) {
    if ( o is IEnumerable) {
        Console.WriteLine(string.Join("|", o as IEnumerable));
    } else {
        Console.WriteLine(o.ToString());
    }
}

DefaultShow("a,b,c".Split(","));

affiche:

"a | b | c |"

when:

internal static void DefaultShow(object o) {
    if ( o is IEnumerable) {
        StringBuilder sb = new StringBuilder(1024);
        foreach(var i in o as IEnumerable ) {
            sb.Append($"{i}|");
        }
        Console.WriteLine(sb.ToString());
    } else {
        Console.WriteLine(o.ToString());
    }
}

DefaultShow("a,b,c".Split(","));

affiche :

System.String []

c#

3 commentaires

Soyez prudent avec string (car c'est IEnumerable ).


@John well seen (si dicible en anglais)


"bien repéré" :) Malheureusement, il m'a mordu avant donc j'en suis conscient maintenant.


5 Réponses :


0
votes

Vérifiez quelle méthode est utilisée

 entrez la description de l'image ici

Le (o as IEnumerable) est traité comme un élément du tableau d'objets (à cause des paramètres), tandis que la méthode dont vous avez besoin attend IEnumerable .

Mise à jour: Btw, je ne sais pas pourquoi Visual Studio me montre que le premier argument a le type char - cela devrait être une chaîne, semble être un problème avec VS))


0 commentaires

0
votes

Parce que string.Join ("|", o as IEnumerable) utilisera cette surcharge:

public static string Join(string separator, params object[] values)

Il n'y a pas de surcharge qui prend IEnumerable comme paramètre. Il y a surcharge uniquement pour la version générique ( IEnumerable ).


0 commentaires

0
votes

Console.WriteLine (o) appellera o.ToString () en interne et affichera System.String [] car la variable o est un tableau de chaînes.


0 commentaires

0
votes

Cela se produit parce que vous vous inscrivez en tant que IEnumerable . Donc, pour afficher tous les éléments, vous devez convertir en IEnumerable:

if (o is IEnumerable<string>)
{             
    Console.WriteLine(string.Join("|", (o as IEnumerable<string>)));             
}
else
{
     Console.WriteLine(o.ToString());
}


1 commentaires

Pourquoi vérifiez-vous: o est IEnumerable . Il n'est utilisé nulle part.



3
votes

Si vous regardez le liste des surcharges de string.Join , aucune d'elles n'accepte un IEnumerable . Il y en a un qui accepte une IEnumerable , mais c'est tout.

Par conséquent, votre appel à string.Join sera lié à la surcharge qui prend un objet params [] . Du point de vue de la méthode, l ' objet [] n'a qu'un seul élément, et c'est le IEnumerable , il appelle donc ToString () sur et retourne.

Vous voulez probablement convertir le IEnumerable en un IEnumerable d'abord, puis tout convertir en une chaîne par ToString :

internal static void DefaultShow(object o) {
    if ( o is IEnumerable) {
        Console.WriteLine(string.Join("|", (o as IEnumerable).Cast<object>().Select(x => x.ToString())));
    } else {
        Console.WriteLine(o.ToString());
    }
}


0 commentaires