首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用string.Substring(char,char)代替string.Substring(int,int)?

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

Stack Overflow用户
提问于 2019-07-05 07:53:02
回答 1查看 232关注 0票数 5

我创建了在leftCharrightChar之间返回字符串的扩展方法

代码语言:javascript
复制
    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;
        }

当我像这样调用它时:

代码语言:javascript
复制
    string str = "M(234:342);".Substring('(', ')');

我有个例外:

System.ArgumentOutOfRangeException: startIndexнеможетбытьбольше,чемдлинастроки.startIndex System.String.Substring(Int32 startIndex,Int32 length)

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

(扩展)字符串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)结合起来,检查输入字符串的长度。
EN

回答 1

Stack Overflow用户

发布于 2019-07-05 07:58:47

是否有一种方法可以强迫解释器不要执行强制字符操作?

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

在您的示例中,常规string.Substring(int, int)方法与参数(char, char)兼容,因为从charint的隐式转换。

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56898822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档