É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 []
5 réponses
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());
}
}
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>
).
Console.WriteLine (o) appellera o.ToString () en interne et affichera System.String [] car la variable o est un tableau de chaînes.
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))
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());
}
Questions connexes
De nouvelles questions
c#
C # (prononcé "see sharp") est un langage de programmation multi-paradigme de haut niveau, typé statiquement développé par Microsoft. Le code C # cible généralement la famille d'outils et d'exécutions Microsoft .NET, notamment le .NET Framework, .NET Core et Xamarin. Utilisez cette balise pour les questions sur le code écrit en C # ou en spécification formelle de C #.