Подтвердить что ты не робот

Почему метод Remove() позволяет разрешить char в качестве параметра?

Рассмотрим этот код:

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

Если я запустил этот код, я получаю это исключение:

startIndex должен быть меньше длины строки.

Почему я могу передать char вместо int для этого метода? Почему бы мне не получить ошибку компиляции?

enter image description here

Почему у этого компилятора такое поведение?

4b9b3361

Ответ 1

вы пытаетесь удалить 'x', который объявлен как char, x равен 120

.Remove принимает только 2 параметра типа int начало и (необязательный) счетчик для удаления из строки.

Если вы передадите char, , он будет преобразован в целочисленное представление. Значение, если вы передаете "x" → 120, больше, чем строка .Length, и поэтому она будет вызывать эту ошибку!

Ответ 2

Implicit conversion позволяет вам скомпилировать этот код, поскольку char может быть преобразован в int и не требуется явное преобразование. Это также будет компилироваться, и ответ будет 600 (120*5) -

        char c = 'x';
        int i = c;
        int j = 5;
        int answer = i * j;

Из MSDN неявное преобразование суммируется ниже:

Implicit conversion

Как утверждали другие, вы можете использовать Replace или Remove с допустимыми вводами.

Ответ 3

Нет перегрузки 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);

Ответ 4

Удалить принимает параметр int для индекса внутри строки, чтобы начать удаление символов, см. msdn. Убрать вызов должен автоматически преобразовать char в его индекс целочисленного ASCII и попытаться удалить символ из этого индекса из строки, он не пытается удалить сам символ.

Если вы просто хотите удалить любые случаи, когда x встречается в строке:

"testx".Replace("x",string.Empty);

Если вы хотите удалить первый индекс x в строке do:

var value = "testx1x2";
var newValue = value.Remove(value.IndexOf('x'), 1);

Ответ 5

Поскольку вы передаете char в функцию, и это значение получает преобразование в int во время выполнения, поэтому вы получаете ошибку выполнения, потому что значение char во время выполнения больше, чем длина строки. Вы может попробовать следующее: -

var x = "tesx";
var s = x.Remove(x.IndexOf('x'), 1);

или

var s = x.Replace("x",string.Empty);

.Remove принимает параметр int как. Удалить принимает два параметра. Первая - это то, в какой позиции вы хотите начать свою строку. (Счет начинается с нуля.) Второй параметр - сколько символов вы хотите удалить, начиная с указанной вами позиции.

На боковой ноте:

Из MSDN:

Этот метод (.Remove) не изменяет значение текущего экземпляра. Вместо этого он возвращает новую строку, в которой количество символов указанные параметром count, были удалены. Персонажи удаляется в позиции, указанной startIndex.

Ответ 6

Вы можете использовать методы расширения для создания собственных методов для уже существующих классов. Рассмотрим следующий пример:

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

Ответ 7

В: Почему я могу передать char вместо int для этого метода?

A: Потому что он не реализован в С#!

В: Почему я не могу получить ошибку компиляции?

A: поскольку символ 'x' неявно переводится в int эквивалент 120

используйте строку ниже

var s = x.Replace("x",string.Empty);