考虑这段代码:
var x = "tesx".Remove('x');
如果我运行这段代码,我会得到这个异常:
startIndex 必须小于字符串的长度。
为什么我可以将 char 而不是 int 传递给此方法?为什么我没有收到编译错误?
为什么编译器会有这种行为?
您尝试删除声明为 char 的“x”,x 等于 120
.Remove
仅需要 2 个类型的参数startint
和(可选)count 从字符串中删除。
如果你传递一个字符,它将被转换为整数表示。意思是如果你传递 'x' -> 120 大于字符串.Length
,这就是为什么它会抛出这个错误!
Implicit conversion
允许您编译此代码,因为 char 可以转换为 int 并且不需要显式转换。这也将编译,答案将是600 (120*5)
-
char c = 'x';
int i = c;
int j = 5;
int answer = i * j;
从MSDN,隐式转换总结如下 -
正如其他人所说,您可以使用Replace
或Remove
使用有效输入。
没有Remove
需要 a 的重载char
,因此该字符被隐式转换为 anint
并且该Remove
方法尝试将其用作字符串的索引,这在字符串之外。这就是为什么您会收到运行时错误而不是编译时错误说明参数类型错误的原因。
要使用Remove
删除字符串的一部分,您首先需要找到该部分在字符串中的位置。例子:
var x = "tesx";
var x = x.Remove(x.IndexOf('x'), 1);
这将删除'x'
字符串中第一次出现的 。如果可能出现不止一次,并且您想全部删除,则使用Replace
效率更高:
var x = "tesx".Replace("x", String.Empty);
Remove 采用 int 参数作为字符串中的索引以开始删除字符,请参阅msdn。remove 调用必须自动将 char 转换为其 ASCII 整数索引并尝试从字符串中删除该索引处的字符,而不是尝试删除字符本身。
如果您只想删除字符串中出现 x 的任何情况,请执行以下操作:
"testx".Replace("x",string.Empty);
如果要删除字符串中 x 的第一个索引,请执行以下操作:
var value = "testx1x2";
var newValue = value.Remove(value.IndexOf('x'), 1);
由于您在函数中传递了一个 char 并且该值在运行时转换为 int 因此您收到运行时错误,因为运行时 char 的值大于字符串的长度。您可以尝试这样:-
var x = "tesx";
var s = x.Remove(x.IndexOf('x'), 1);
或者
var s = x.Replace("x",string.Empty);
.Remove将 int 作为参数。Remove 需要两个参数。第一个是您要从字符串中的哪个位置开始。(计数从零开始。)第二个参数是您要删除的字符数,从您指定的位置开始。
附带说明:
来自 MSDN:
此方法(.Remove) 不会修改当前实例的值。相反,它返回一个新字符串,其中删除了 count 参数指定的字符数。在 startIndex 指定的位置删除字符。
您可以使用扩展方法为已经存在的类创建自己的方法。考虑以下示例:
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);
}
}
}