é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 []
5 Réponses :
Vérifiez quelle méthode est utilisée
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))
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 ).
Console.WriteLine (o) appellera o.ToString () en interne et affichera System.String [] car la variable o est un tableau de chaînes.
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());
}
Pourquoi vérifiez-vous: o est IEnumerable . Il n'est utilisé nulle part.
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());
}
}
Soyez prudent avec
string(car c'estIEnumerable ).@John well seen (si dicible en anglais)
"bien repéré" :) Malheureusement, il m'a mordu avant donc j'en suis conscient maintenant.