如何使用string.Substring(char,char)代替string.Substring(int,int)?

时间:2019-07-05 07:53:02

标签: c# visual-studio-2010 substring extension-methods

我制作了扩展方法,该方法返回leftCharrightChar之间的字符串:

    public static string Substring(this string This, char leftChar, char rightChar)
        {
            int i_left = This.IndexOf(leftChar);
            if (i_left >= 0)
            {
                int i_right = This.IndexOf(rightChar, i_left);
                if (i_right >= i_left)
                {
                    return This.Substring(i_left + 1, i_right - i_left - 1);
                }
            }
            return null;
        }

当我这样调用它时:

    string str = "M(234:342);".Substring('(', ')');

我得到了例外:

  

System.ArgumentOutOfRangeException:startIndexнеможетбытьбольше,   чемдлинастроки。 Имяпараметра:startIndexв   System.String.Substring(Int32 startIndex,Int32长度)

扩展方法和调用代码的名称空间正确。 IntelliSense向我建议了3种扩展方法(两种基本方法和一种方法)。

  

(扩展名)字符串string.Substring(char leftChar,char rightChar)

很明显string.Substring(int startIndex, int Length)与我的扩展方法重叠,因为编译器会自动将char强制转换为int。

是否有一种方法可以强制编译器不要将char强制转换为int


  • 如果我重命名扩展方法(例如Substring2),那么所有方法都有效。
  • 如果我将chars更改为params char[],如果我像params一样调用它,它将不起作用,但是当然像array一样。
  • 如果删除扩展方法,"M(234:342);".Substring('(', ')')不会引发任何编译错误,但仍会引发异常。
  • 如果在扩展方法中将chars更改为strings,它也可以使用。这是我目前最喜欢的解决方案-将我的Substring(char, char)Substring(string, string)结合使用,并检查输入字符串的长度。

1 个答案:

答案 0 :(得分:11)

  

是否有一种方法可以强制解释器不要将强制转换为int类型的字符?

不。当遇到针对目标表达式执行的方法调用时,编译器首先检查目标声明类型上的任何实例方法是否与参数兼容。如果没有兼容的方法,它只会查找扩展方法。

在您的情况下,常规的string.Substring(int, int)方法与参数(char, char)兼容,因为它是从charint的隐式转换。

最简单的解决方案是重命名扩展方法-类似于SubstringBetween