C#扩展方法重载

C#扩展方法重载,c#,extension-methods,overloading,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

我有两种扩展方法:

    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);
    }
using MyApplicationNamespace.ToStringExtensionClass;
这行不通。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 "";
    }
公共静态字符串ToString(此列表,字符串分隔符)
{
如果(list.Count>0)
{
字符串s=列表[0]。ToString();
for(int i=1;i
添加对包含扩展方法的类的引用:

    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);
    }
using MyApplicationNamespace.ToStringExtensionClass;
VS/ReSharper不提供自动添加引用,因为该方法已经被识别,只是没有特定的签名

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

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


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

我认为您的问题在于您正在为泛型列表指定对象类型,而不是将其作为泛型方法

当您定义以下内容时,请查看它是否有效:

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

public static string ToString<T>(this List<T> list, string delimiter) 
{ 
    return String.join(list, delimiter); 
} 
公共静态字符串ToString(此列表,字符分隔符)
{ 
返回ToString(列表,分隔符.ToString());
} 
公共静态字符串ToString(此列表,字符串分隔符)
{ 
返回String.join(列表,分隔符);
} 

您使用字符串分隔符的原始函数只是在调用自身,因此您必须更改
ToString(此列表,字符串分隔符)
,以便在此处执行一些有用的操作,例如字符串。join

是仅我还是您的ToString方法无限期地调用自身?这是tokens变量的类型?请参阅编辑以获取我的答案,作为编辑的后续操作。最后一个ToString应该真正使用StringBuilder,而不是将列表项附加到本地字符串…@MikeCorcoran它应该实际使用
string.Join
。。。这显然和StringBuilder一样快,因为你已经在某种IEnumerable中拥有了所有的子字符串。我不太确定如何实现你所描述的。我想我是个新手。我尝试过:return ListExtensions.ToString(标记,分隔符);它将显示char重载,但出于某种原因它不喜欢令牌…@Thick\u propheT这可能是因为您没有使方法通用,这意味着它需要
列表
-哪些令牌不是。在答案的末尾尝试使用两个通用方法。你是对的,我尝试了:return ListExtension.ToString(new List(),delimiter);满意率达110%XD@Thick_propheT这将创建一个新的空列表。。。你确定这就是你使用的代码吗?哦,不,这绝对不是我需要的,我只是想看看怎样才能满足visual studio的要求。这将导致无休止和无用的递归。哈哈,是的,我现在明白了。我实际上不知道原始海报在字符串扩展方法中尝试了什么。我想这是他们称之为StackOverflow的原因,因为他想要一个字符串,并使用一个列表和分隔符来缩小选项范围。
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);
}
var list = new List<int> { 1, 2, 3, 4, 5 };
var str = list.ToString(' ');
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)
{
    ...
}
string.Join(delimiter, list);
public static string ToString<T>(this List<T> list, char delimiter) 
{ 
    return ToString<T>(list, delimiter.ToString()); 
} 

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