【问题标题】:How to use string.Substring(char, char) instead string.Substring(int, int)?如何使用 string.Substring(char, char) 而不是 string.Substring(int, int)?
【发布时间】:2019-11-15 20:06:40
【问题描述】:

我做了一个扩展方法,它返回一个介于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 种扩展方法(两种基本方法和一种我的方法)。

(extension) string string.Substring(char leftChar, char rightChar)

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

有没有办法强制编译器不将char 转换为int


  • 如果我重命名扩展方法(如Substring2)一切正常。
  • 如果我将chars 更改为params char[],它不起作用,如果我像参数一样调用它,但当然像数组一样工作。
  • 如果我删除扩展方法,"M(234:342);".Substring('(', ')') 不会抛出任何编译错误,但仍然会抛出异常。
  • 如果我在扩展方法中将chars 更改为strings,它也可以工作。这是我目前最喜欢解决此问题的解决方案 - 将我的 Substring(char, char)Substring(string, string) 结合起来检查输入字符串的长度。

【问题讨论】:

  • 注意:.NET 中没有解释器。有运行时和编译器。在这种情况下,您对编译器感兴趣。
  • 另一个注意事项:我强烈建议您遵循 .NET 命名约定,因此请使用 camelCase 作为参数名称。
  • @JonSkeet 谢谢。我拼错了。抱歉,英语不是我的母语。

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


【解决方案1】:

有没有办法强制解释器不将 char 转换为 int?

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

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

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

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 2016-02-26
    • 2012-08-21
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 2011-08-20
    • 2017-03-21
    • 1970-01-01
    相关资源
    最近更新 更多