C#扩展方法重载

Thi*_*heT 2 c# extension-methods overloading

我有两种扩展方法:

    public static string ToString(this List<object> list, char delimiter)
    {
        return ToString<object>(list, delimiter.ToString());
    }

    public static string ToString(this List<object> list, string delimiter)
    {
        return ToString<object>(list, delimiter);
    }
Run Code Online (Sandbox Code Playgroud)

我用这个时:

    char delimiter = ' ';
    return tokens.ToString(delimiter);
Run Code Online (Sandbox Code Playgroud)

它不会起作用.char重载也不会出现在代码完成列表中.任何人都可以告诉我如何使这项工作?

编辑

我不小心忘了提到实际上有3种扩展方法,第三种是:

    public static string ToString<T>(this List<T> list, string delimiter)
    {
        if (list.Count > 0)
        {
            string s = list[0].ToString();

            for (int i = 1; i < list.Count; i++)
                s += delimiter + list[i].ToString();

            return s;
        }

        return "";
    }
Run Code Online (Sandbox Code Playgroud)

Sim*_*Var 9

添加对具有扩展方法的类的引用:

using MyApplicationNamespace.ToStringExtensionClass;
Run Code Online (Sandbox Code Playgroud)

VS/ReSharper不提供自动添加引用,因为该方法已被识别,而不是使用该特定签名.

此外,除非您有第三个带泛型参数的扩展方法,否则您的方法本身不会编译.

他们为我工作的方式(编译和逻辑):

public static string ToString(this List<object> list, char delimiter)
{
    return ToString(list, delimiter.ToString());
}

public static string ToString(this List<object> list, string delimiter)
{
    return string.Join(delimiter, list);
}
Run Code Online (Sandbox Code Playgroud)

用法将是:

var list = new List<int> { 1, 2, 3, 4, 5 };
var str = list.Cast<object>().ToList().ToString(' ');
Run Code Online (Sandbox Code Playgroud)

如果您想避免强制转换并使方法通用,请将它们更改为:

public static string ToString<T>(this List<T> list, char delimiter)
{
    return ToString(list, delimiter.ToString());
}

public static string ToString<T>(this List<T> list, string delimiter)
{
    return string.Join(delimiter, list);
}
Run Code Online (Sandbox Code Playgroud)

然后使用更清洁:

var list = new List<int> { 1, 2, 3, 4, 5 };
var str = list.ToString(' ');
Run Code Online (Sandbox Code Playgroud)

编辑

因此,在您编辑后,我更了解您的问题.您应该丢失非泛型方法并具有泛型重载以接受char.

public static string ToString<T>(this List<T> list, char delimiter)
{
    return ToString(list, delimiter.ToString());
}

public static string ToString<T>(this List<T> list, string delimiter)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

此外,您尝试实现的逻辑可以通过以下方式轻松实现:

string.Join(delimiter, list);
Run Code Online (Sandbox Code Playgroud)

所以你基本上可以删除所有这些方法并使用它,除非你真的希望它作为列表的扩展方法.