【发布时间】:2019-11-15 20:06:40
【问题描述】:
我做了一个扩展方法,它返回一个介于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 长度)
扩展方法的命名空间和调用代码正确。 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