String.Join returns System.Collections.Generic.List`1[System.String] 的 IEnumerable 扩展方法

IEnumerable extension method with String.Join returns System.Collections.Generic.List`1[System.String]

我很惊讶 list.Join() returns System.Collections.Generic.List`1[System.String]

static void Main(string[] args)
{
    var list = new List<string>();

    list.Add("1024");
    list.Add("2048");

    Console.WriteLine(list.Join());

    Console.WriteLine(string.Join(", ", list));

    Console.ReadKey();
}

扩展方法为

public static class StringExtensions
{
    public static string Join(this IEnumerable list)
    {
        return string.Join(", ", list);
    }
}

我不明白它不 return 我所期望的,在我 认为 我很熟悉的上下文中 string.join 和扩展方法。


我内心在想它会是这样的

static string Join(IEnumerable list)
{
    StringBuilder sb = new StringBuilder();

    foreach (var item in list)
    {
        sb.Append(item).Append(", ");
    }

    return sb.ToString();
}

最后,我用这个版本,支持通用和非通用版本。

public static string Join(this IEnumerable list)
{
    return Join(list.Cast<object>());
}

public static string Join<T>(this IEnumerable<T> list)
{
    return string.Join(",", list);
}

原因是:扩展方法将泛型 List<string>/IEnumerable<string> 转换为非泛型 IEnumerable.

因此,您将在此处使用单个对象调用 this params overload of string.Join

public static string Join(this IEnumerable list)
{
    return string.Join(", ", list);
}

由于对象是 List<string>,它不会覆盖 ToString,您将得到类型名称作为结果:System.Collections.Generic.List1[System.String]

您可以通过以下方式更改您的扩展方法:

public static string Join(this IEnumerable list)
{
    return string.Join(", ", list.Cast<object>());
}