Как использовать string.Substring (char, char) вместо string.Substring (int, int)? - PullRequest
5 голосов
/ 05 июля 2019

Я сделал метод расширения, который возвращает строку между 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) с проверкой длины входных строк.

1 Ответ

12 голосов
/ 05 июля 2019

Есть ли способ заставить переводчика не использовать приведенный символ к int?

Нет.Когда он сталкивается с вызовом метода, выполняемого для целевого выражения, компилятор сначала проверяет, совместимы ли какие-либо методы экземпляра объявленного типа целевого объекта с аргументами.Он ищет только методы расширения, если есть нет совместимых методов.

В вашем случае обычный метод string.Substring(int, int) совместим с аргументами (char, char) из-за неявного преобразования из char to int.

Самое простое решение - переименовать ваш метод расширения - что-то вроде SubstringBetween возможно.

...