为什么字符串Remove()方法允许char作为参数?

58 c# string char

考虑以下代码:

var x = "tesx".Remove('x');
Run Code Online (Sandbox Code Playgroud)

如果我运行此代码,我会得到以下异常:

startIndex必须小于string的长度.

为什么我可以将char而不是int传递给此方法?为什么我没有收到编译错误?

在此输入图像描述

为什么编译器有这种行为?

Mic*_*haC 93

你试图删除'x',它被声明为char,x等于120

.Remove只需要2个参数类型的int开始和(可选)计数,以从字符串中删除.

如果传递char,它将转换为整数表示.意思是如果你传递'x' - > 120比字符串大.Length,这就是为什么它会抛出这个错误!

  • 为了澄清,这是一个用C#语言做出的设计决定,它认为`char`可以隐式转换为`int`(C的残余). (55认同)

Roh*_*ats 27

Implicit conversion允许您编译此代码,因为char可以转换为int,并且不需要显式转换.这也将编译,答案将是600 (120*5)-

        char c = 'x';
        int i = c;
        int j = 5;
        int answer = i * j;
Run Code Online (Sandbox Code Playgroud)

MSDN,隐式转换总结如下 -

隐式转换

正如其他人所说,您可以使用ReplaceRemove使用有效输入.


Guf*_*ffa 21

没有重载Remove需要a char,因此字符被隐式转换为a,int并且该Remove方法尝试将其用作字符串的索引,这是字符串之外的方式.这就是为什么你得到运行时错误而不是编译时错误,说参数类型错误.

要用于Remove删除字符串的一部分,首先需要找到字符串中该部分的位置.例:

var x = "tesx";
var x = x.Remove(x.IndexOf('x'), 1);
Run Code Online (Sandbox Code Playgroud)

这将删除'x'字符串中的第一次出现.如果可能有多个出现,并且您想要删除所有,则使用Replace效率更高:

var x = "tesx".Replace("x", String.Empty);
Run Code Online (Sandbox Code Playgroud)


gmn*_*gmn 9

Remove为字符串中的索引获取一个int参数以开始删除字符,请参阅msdn.remove调用必须自动将char转换为其ASCII整数索引并尝试从字符串中删除该索引处的字符,它不会尝试删除该字符本身.

如果您只想删除字符串中出现x的任何情况,请执行以下操作:

"testx".Replace("x",string.Empty);
Run Code Online (Sandbox Code Playgroud)

如果要删除字符串中x的第一个索引,请执行以下操作:

var value = "testx1x2";
var newValue = value.Remove(value.IndexOf('x'), 1);
Run Code Online (Sandbox Code Playgroud)