58 votes

Pourquoi la chaîne de méthode Remove() de permettre à un char en paramètre?

Considérer ce code:

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

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

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

Pourquoi ne puis-je passer un char au lieu d'un int à cette méthode? Pourquoi ne reçois-je pas d'erreur de compilation?

enter image description here

Pourquoi le compilateur avoir ce comportement?

93voto

MichaC Points 6703

vous essayez de supprimer les 'x' qui est déclarée en tant que char, x est égal à 120

L' .Remove ne prend que 2 paramètres de type int le début et (en option) nombre de supprimer à partir de la chaîne.

Si vous passez un char, il sera converti à la représentation entière. De sens que si vous passez 'x' -> 120 est plus grande que la chaîne de caractères .Length et c'est pourquoi il va lancer cette erreur!

27voto

Rohit Vats Points 36234

Implicit conversion vous permet de compiler ce code depuis char peut être converti en int et pas de conversion explicite est nécessaire. Cela permettra également de compiler et la réponse sera 600 (120*5) -

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

À partir de MSDN, la conversion implicite est résumée ci-dessous -

Implicit conversion

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

21voto

Guffa Points 308133

Il n'y a pas de surcharge d' Remove qui prend un char, de sorte que le personnage est implicitement converti en int et de la Remove méthode tente de l'utiliser comme un index dans la chaîne, ce qui est à l'extérieur de la chaîne. C'est pourquoi vous obtenez cette erreur d'exécution au lieu d'un moment de la compilation d'erreur disant que le type du paramètre est incorrect.

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

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

Cela va supprimer la première occurrence de l' 'x' dans la chaîne. Si il pourrait y avoir plus d'une occurrence, et que vous souhaitez supprimer, en utilisant l' Replace est plus efficace:

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

9voto

grrrrrrrrrrrrr Points 1243

Retirez prend un int en paramètre pour l'index dans la chaîne de commencer à supprimer les caractères, voir la rubrique msdn. La suppression de l'appel d'offres doit convertir automatiquement le char de son ASCII index entier et essayez de supprimer le caractère à l'indice de la chaîne, il n'est pas d'essayer de supprimer le caractère lui-même.

Si vous voulez juste pour enlever tous les cas, si x se produit dans la chaîne de faire:

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

Si vous souhaitez supprimer le premier indice de x dans la chaîne de faire:

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

2voto

Rahul Tripathi Points 1

Puisque vous êtes de passage d'un char dans la fonction et que cette valeur est se converti en int lors de l'exécution, par conséquent, vous obtenez l'erreur d'exécution, car la valeur de char au moment de l'exécution est plus que 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);

.Retirez prend le int en paramètre. Retirez prend deux paramètres. Le premier est ce que la position dans votre chaîne de caractères que vous souhaitez lancer au. (La numérotation commence à zéro.) Le deuxième paramètre est le nombre de caractères que vous souhaitez supprimer, à partir de la position spécifiée.

Sur une note de côté:

À partir de MSDN:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X