2011-11-04 5 views
0

Pourquoi je reçois:C# erreur du compilateur avec Substring

Index and length must refer to a location within the string. 
Parameter name: length 

quand je compile ce code: http://pastebin.com/CW4EcCM8

une partie de celui-ci:

public string findFileEnding(string file) 
    { 
     int index1 = file.IndexOf('.'); 
     file = file.Substring(index1, file.Length); 
     return file; 
    } 

Merci;)

+0

Il n'y a pas vérifier que index1 est> -1 (qu'il y avait même un. Dans la chaîne). Si vous faites une sous-chaîne w/index: -1 cela renvoie aussi cette erreur ... – Rikon

+1

Pas une réponse à votre question, mais un moyen plus fiable pour trouver une extension de fichier est d'utiliser la classe Path: http: // msdn. microsoft.com/en-us/library/system.io.path.aspx –

+0

@Rikon Même erreur, mais avec un message différent ... –

Répondre

2

Le deuxième argument à Substring, s'il est présent, est la longueur souhaitée o f la sous-chaîne. Vous demandez donc une chaîne de la même longueur que file mais en commençant à une position éventuellement différente de 0. Cela ferait que la fin de votre sous-chaîne dépasserait la fin de file.

En supposant que vous voulez obtenir tous file à partir de la position index1, vous pouvez laisser le deuxième argument tout à fait:

file = file.Substring(index1); 

Pour rendre cette solide, vous aurez envie de mettre en un peu plus de contrôles :

  1. file peut être null. La valeur de retour de IndexOf peut correspondre à -1. Cela se produirait si file ne contient pas de point.
+0

Peut vouloir mentionner que l'OP devrait aussi vérifier que 'IndexOf' renvoie -1. – CodeNaked

0

Ce n'est pas une erreur de compilation, c'est une erreur d'exécution.

Notez la documentation String.Substring(int, int):

Récupère une sous-chaîne de cette instance. La sous-chaîne commence à une position de caractère spécifiée [startIndex] et a une longueur spécifiée [length].

La sous-chaîne aura donc la longueur spécifiée. Par conséquent, il doit y avoir suffisamment de caractères commençant à startIndex pour renvoyer une sous-chaîne de la longueur spécifiée. Par conséquent, les inégalités suivantes doivent être remplies pour que String.Substring pour réussir sur une instance s de string:

startIndex >= 0 
length >= 0 
length > 0 implies startIndex + length <= s.Length 

Notez que si vous voulez juste une sous-chaîne de index à la fin de la chaîne, vous pouvez dire

s.Substring(index); 

ici, la seule contrainte est

startIndex>= 0 
startIndex < s.Length 
0

Vous voulez faire quelque chose comme e est:

public string FindFileEnding(string file) 
{ 
    if (string.IsNullOrEmpty(file)) 
    { 
     // Either throw exception or handle the file here 
     throw new ArgumentNullException(); 
    } 
    try 
    { 
     return file.Substring(file.LastIndexOf('.')); 
    } 
    catch (Exception ex) 
    { 
     // Handle the exception here if you want, or throw it to the calling method 
     throw ex; 
    } 
} 
+0

Je suppose que vous vouliez dire 'string.IsNullOrEmpty (file)' pour vous la première if-statement, car ce que vous avez n'est pas valide à moins que vous n'ayez défini une méthode d'extension personnalisée. Vous devriez également vérifier la valeur de retour de LastIndexOf. Renouveler cette exception n'aurait pas de sens. – CodeNaked

+0

@CodeNaked Merci pour la vérification du code, difficile à faire seulement dans le navigateur. Y at-il des sites qui valident C# pour vous? Ce n'est pas destiné à être la réponse complète, juste un point de départ. Et si le dernier index n'est pas valide, vous devrez le gérer avant ou après. Je l'avais à l'origine avec 'int index = file.LastIndexOf ('.')' Mais l'ai enlevé car il n'y avait rien indiquant comment ils voulaient gérer les erreurs ou les mauvaises valeurs – John

+1

Je ne suis pas au courant des sites qui le font, mais il sont quelques [outils légers] (http://stackoverflow.com/questions/2775055/looking-for-replacement-for-snippet-compiler). – CodeNaked