C# 使用扩展方法时出现意外行为

C# 使用扩展方法时出现意外行为,c#,string,C#,String,为什么会发生这种情况?请遵守以下准则: static class StringExtension { public static string Remove(this string s, char c) { return s.Replace(c.ToString(), ""); } public static string Remove(this string s, char[] a) { foreach (char c i

为什么会发生这种情况?请遵守以下准则:

static class StringExtension
{
    public static string Remove(this string s, char c)
    {
        return s.Replace(c.ToString(), "");
    }
    public static string Remove(this string s, char[] a)
    {
        foreach (char c in a)
        {
            s = s.Remove((char)c); // <---- ArgumentOutOfRange Exception here
        }
        return s;
    }
}
class Program
{

    static void Main(string[] args)
    {
        char[] a = new char[] { '.', ',' };

        string testString = "Clean.this,string.from,periods.and,commas.";

        Console.WriteLine(testString.Remove(a));

    }
}
静态类扩展
{
公共静态字符串删除(此字符串为s,字符为c)
{
返回s.Replace(c.ToString(),“”);
}
公共静态字符串删除(此字符串s,char[]a)
{
foreach(a中的字符c)
{
s=s.Remove((char)c);//此行:

s.Remove((char) c);
正在调用-如果可能,编译器将始终使用适用的实例方法而不是扩展方法。这是由于从
char
int
的隐式转换而适用的。这是引发异常的方法,因为传递它的参数超出范围。(事实上,你很幸运——在更糟糕的情况下,它会在范围内,并返回完全出乎意料的结果。)


一般来说,我强烈建议您不要创建与扩展类型上的实例方法名称相同的扩展方法,尤其是如果它们具有相同数量的参数。通常,如果不向混合中添加扩展方法,则计算重载已经够难的了。当您无法轻松计算时,请不要忘记这一点你的代码在做什么,一年后阅读代码的人将面临十倍的困难。

不确定替换字符串本身是否是一个好主意,最好使用副本。在我阅读之前,你如何回答这些问题,我不知道。o_uuuo但是+1,回答得很好。:)@梅尔达德:在这种情况下,我很幸运;今晚的《西翼》剧集(DVD)刚刚结束。。。