给出了以下运行方法:
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(","));
显示:
“ a | b | c |”
何时:
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(","));
显示:
System.String []
答案 0 :(得分:2)
如果您查看string.Join
中的list of overloads,则他们都不接受IEnumerable
。有一个接受IEnumerable<string>
的人,就是这样。
因此,您对string.Join
的调用将绑定到需要params object[]
的重载。从方法的角度来看,object[]
仅具有一个元素,即IEnumerable
,因此它对此调用ToString()
并返回。
您可能想先将IEnumerable
强制转换为IEnumerable<object>
,然后通过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());
}
}
答案 1 :(得分:0)
检查使用哪种方法
(由于IEnumerable而将o视为对象数组的一项)(因为有参数),而您需要的方法期望使用IEnumerable
更新:顺便说一句,我不知道为什么Visual Studio向我显示第一个参数为char类型-它应该是字符串,似乎是VS的问题))
答案 2 :(得分:0)
因为string.Join("|", o as IEnumerable)
将使用此重载:
public static string Join(string separator, params object[] values)
没有将IEnumerable
作为参数的重载。仅通用版本(IEnumerable<T>
)有重载。
答案 3 :(得分:0)
Console.WriteLine(o)将在内部调用o.ToString(),并且由于变量o是一个字符串数组,因此将显示System.String []。
答案 4 :(得分:0)
发生这种情况是因为您以IEnumerable
的身份加入。因此,要显示所有项目,应将其投射到IEnumerable<string>
:
if (o is IEnumerable<string>)
{
Console.WriteLine(string.Join("|", (o as IEnumerable<string>)));
}
else
{
Console.WriteLine(o.ToString());
}