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

时间:2013-10-13 10:05:17

标签: c# string char

考虑以下代码:

var x = "tesx".Remove('x');

如果我运行此代码,我会收到此异常:

  

startIndex必须小于字符串的长度。

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

enter image description here

为什么编译器会出现这种行为?

6 个答案:

答案 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开始,隐式转化概述如下 -

Implicit conversion

正如其他人所说,您可以将ReplaceRemove与有效输入结合使用。

答案 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);
        }
    }
}