Étant donné la méthode de fonctionnement suivante:

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:

"a | b | c |"

Quand:

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:

System.String []

c#
1
tschmit007 19 juin 2019 à 16:06

5 réponses

Meilleure réponse

Si vous regardez la liste des surcharges sur string.Join, aucun d'entre eux n'accepte un IEnumerable. Il y en a un qui accepte un IEnumerable<string>, mais c'est tout.

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

Vous voudrez probablement convertir d'abord le IEnumerable en IEnumerable<object>, 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());
    }
}
3
Sweeper 19 juin 2019 à 13:18

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<T>).

0
apocalypse 19 juin 2019 à 13:13

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

0
Skaria Thomas 19 juin 2019 à 13:13

Vérifiez quelle méthode est utilisée

enter image description here

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
Viktor Arsanov 19 juin 2019 à 13:20

Cela se produit parce que vous vous joignez en tant que IEnumerable. Donc, pour afficher tous les éléments que vous devez diffuser sur IEnumerable<string>:

if (o is IEnumerable<string>)
{             
    Console.WriteLine(string.Join("|", (o as IEnumerable<string>)));             
}
else
{
     Console.WriteLine(o.ToString());
}
0
StepUp 19 juin 2019 à 14:29