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