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?
Pourquoi le compilateur a-t-il ce comportement?
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!
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 -
Comme d'autres l'ont indiqué, vous pouvez utiliser Replace
ou Remove
avec des entrées valides.
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);
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);
É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.