Я сделал метод расширения, который возвращает строку между leftChar
и rightChar
:
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 length)
Пространство имен метода расширения и вызывающий код верны.IntelliSense предлагает мне 3 метода расширения (два основных и один мой).
(расширение) string string.Substring (char leftChar, char rightChar)
Очевидно, чтоstring.Substring(int startIndex, int Length)
перекрывается с моим методом расширения, потому что компилятор автоматически преобразует char в int.
Есть ли способ заставить компилятор не выполнять приведение char
к int
?
- Если я переименую метод расширения (например,
Substring2
), все будет работать. - Если я изменю
chars
на params char[]
, он не будет работать, еслиЯ вызываю его как params, но, конечно, работает как массив. - Если я удаляю метод расширения,
"M(234:342);".Substring('(', ')')
не выдает никакой ошибки компиляции, но все равно выдает исключение. - Если яизмените
chars
на strings
в методе расширения, это также работает.Это мое любимое решение для этой проблемы - объединить мои Substring(char, char)
с Substring(string, string)
с проверкой длины входных строк.