为什么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 ,隐式转换总结如下 –

隐式转换

正如其他人所说,你可以使用ReplaceRemove有效的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);