web-dev-qa-db-fra.com

Pourquoi la méthode String Remove () autorise-t-elle un char comme paramètre?

Considérez ce code:

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

Si j'exécute ce code, j'obtiens cette exception:

startIndex doit être inférieur à la longueur de la chaîne.

Pourquoi puis-je transmettre un caractère au lieu d'un entier à cette méthode? Pourquoi ne reçois-je pas une erreur de compilation?

enter image description here

Pourquoi le compilateur a-t-il ce comportement?

58
user1968030

vous essayez de supprimer "x" qui est un caractère déclaré, x est égal à 120

Le .Remove ne prend que 2 paramètres de type int le début et le nombre (facultatif) à supprimer de la chaîne.

Si vous passez un caractère, il sera converti en représentation entière. Ce qui signifie que si vous passez 'x' -> 120 est supérieur à .Length et c'est pourquoi il va lancer cette erreur!

92
MichaC

Implicit conversion Vous permet de compiler ce code car char peut être converti en int et aucune conversion explicite n'est requise. Cela compilera également et la réponse sera 600 (120*5) -

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

De MSDN , la conversion implicite est résumée ci-dessous -

Implicit conversion

Comme d'autres l'ont indiqué, vous pouvez utiliser Replace ou Remove avec des entrées valides.

27
Rohit Vats

Il n'y a pas de surcharge de Remove qui prend un char, donc le caractère est implicitement converti en int et la méthode Remove essaie de l'utiliser comme un index dans la chaîne, qui est bien en dehors de la chaîne. C'est pourquoi vous obtenez cette erreur d'exécution au lieu d'une erreur de temps de compilation indiquant que le type de paramètre est incorrect.

Pour utiliser Remove pour supprimer une partie d'une chaîne, vous devez d'abord trouver où se trouve cette partie dans la chaîne. Exemple:

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

Cela supprimera la première occurrence de 'x' dans la chaîne. S'il peut y avoir plusieurs occurrences et que vous souhaitez tout supprimer, l'utilisation de Replace est plus efficace:

var x = "tesx".Replace("x", String.Empty);
21
Guffa

Remove prend un paramètre int pour l'index dans la chaîne pour commencer à supprimer les caractères, voir msdn . L'appel de suppression doit convertir automatiquement le caractère en son ASCII index entier et essayer de supprimer le caractère de cet index de la chaîne, il n'essaie pas de supprimer le caractère lui-même.

Si vous souhaitez simplement supprimer tous les cas où x apparaît dans la chaîne, procédez comme suit:

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

Si vous souhaitez supprimer le premier index de x dans la chaîne, procédez comme suit:

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

Étant donné que vous passez un caractère dans la fonction et que cette valeur est convertie en int au moment de l'exécution, vous obtenez donc l'erreur d'exécution car la valeur de char au moment de l'exécution est supérieure à la longueur de la chaîne. Vous pouvez essayer comme ceci: -

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

ou

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

. Remove prend l'int comme paramètre. Supprimer prend deux paramètres. La première est à quelle position de votre chaîne vous souhaitez commencer. (Le décompte commence à zéro.) Le deuxième paramètre est le nombre de caractères que vous souhaitez supprimer, à partir de la position que vous avez spécifiée.

A côté:

Depuis MSDN:

Cette méthode (.Remove) ne modifie pas la valeur de l'instance actuelle. Au lieu de cela, il renvoie une nouvelle chaîne dans laquelle le nombre de caractères spécifié par le paramètre count a été supprimé. Les caractères sont supprimés à la position spécifiée par startIndex.

2
Rahul Tripathi