为什么stringRemove()方法允许char作为参数?
考虑这个代码:
var x = "tesx".Remove('x');
如果我运行这个代码,我得到这个exception:
startIndex必须小于string的长度。
为什么我可以通过一个字符而不是一个int这个方法? 为什么我没有收到编译错误?
为什么编译器有这种行为?
你尝试删除一个声明为char的x,x等于120
.Remove
只需要2个参数的typesint
开始和(可选)计数从string中删除。
如果你传递一个字符, 它将被转换为整型表示 。 意思是说,如果你传递“x” – > 120大于string的.Length
,那就是为什么它会抛出这个错误!
Implicit conversion
可以让你编译这个代码,因为char可以转换为int,不需要显式转换。 这也将编译和答案将是600 (120*5)
–
char c = 'x'; int i = c; int j = 5; int answer = i * j;
从MSDN ,隐式转换总结如下 –
正如其他人所说,你可以使用Replace
或Remove
有效的input。
Remove
没有使用一个char
重载,所以这个字符被隐式地转换为一个int
,并且Remove
方法试图将它用作string的索引,这是string之外的方式。 这就是为什么你得到运行时错误,而不是编译时错误,说参数types是错误的。
要使用Remove
来删除部分string,首先需要findstring中的哪个部分。 例:
var x = "tesx"; var x = x.Remove(x.IndexOf('x'), 1);
这将删除string中的第一个'x'
。 如果可能有多个发生,并且您想要全部删除,则使用Replace
更为有效:
var x = "tesx".Replace("x", String.Empty);
Remove在string中为索引提供一个int参数来开始删除字符,请参阅msdn 。 remove调用必须自动将char转换为它的ASCII整数索引,并尝试从string中删除该索引处的字符,而不是试图去除字符本身。
如果你只是想删除string中出现x的任何情况,请执行以下操作:
"testx".Replace("x",string.Empty);
如果你想删除string中的第一个索引x:
var value = "testx1x2"; var newValue = value.Remove(value.IndexOf('x'), 1);
既然你在函数中传递了一个字符,并且这个值在运行时被转换成了int,所以你会得到运行时错误,因为在运行时string的值比string的长度多。你可以尝试像这样:
var x = "tesx"; var s = x.Remove(x.IndexOf('x'), 1);
要么
var s = x.Replace("x",string.Empty);
.Remove以int为参数。 删除需要两个参数。 第一个是你想要开始的string中的什么位置。 (计数从零开始。)第二个参数是您要删除的字符数,从您指定的位置开始。
在旁注:
来自MSDN:
此方法(.Remove)不会修改当前实例的值。 而是返回一个新的string,其中由count参数指定的字符数已被删除。 在由startIndex指定的位置删除字符。
您可以使用扩展方法为已经存在的类创build自己的方法。 考虑下面的例子:
using System; using MyExtensions; namespace ConsoleApplication { class Program { static void Main(string[] args) { const string str1 = "tesx"; var x = str1.RemoveByChar('x'); Console.WriteLine(x); Console.ReadKey(); } } } namespace MyExtensions { public static class StringExtensions { public static string RemoveByChar(this String str, char c) { return str.Remove(str.IndexOf(c), 1); } } }
问:为什么我可以通过一个字符而不是一个int这个方法?
答:因为它没有在C#中实现!
问:为什么我没有收到编译错误?
答:因为字符“x”隐含地转换为等于120的int
使用下面的线
var s = x.Replace("x",string.Empty);