L'opérateur +
en VB.NET (pour des raisons de compatibilité ascendante) signifie les deux ajouter et concaténer en fonction des types des variables qu'il est utilisé avec. Avec deux types numériques (Integer
, Single
, Double
, etc.), il ajoute les valeurs ensemble comme vous le souhaitez. Cependant, avec String
types, il concatène les deux chaînes.
On peut donc présumer, vos variables XVAL
et NEWVAL
sont String
types parce qu'ils sont en cours de lecture d'un fichier texte, ce qui est à l'origine VB.NET les concaténer dans une nouvelle chaîne au lieu de les additionner. Pour obtenir le comportement que vous attendez, vous devez les convertir en types numériques.
Certains des autres réponses suggèrent coulée casting simplement les valeurs de chaîne pour les types numériques (CInt
, CSng
, CDbl
, etc.), mais cela peut ne pas fonctionner comme prévu si la valeur contenue par votre chaîne ne peut pas être convertie en nombre. La méthode Int32.Parse
lèvera une exception si la valeur détenue par votre chaîne ne peut pas être représentée comme un nombre. Cela est particulièrement important à garder à l'esprit si vous lisez des valeurs d'un fichier texte qui ne sont pas garanties d'adhérer à des contraintes particulières.
Au lieu de cela, vous voulez probablement utiliser quelque chose comme Int32.TryParse
, qui renvoie une valeur Boolean
indiquant si oui ou non la conversion a réussi et ne lancera pas une exception.
+1 pour utiliser les fonctions .NET BCL standard plutôt que les fonctions spécifiques à VB qui ne sont présentes que pour la rétrocompatibilité. –
@Adam: Je ne sais vraiment pas ce qu'est la haine spécifique à VB, mais je vais vous poser la même question que vous m'avez posée: avez-vous un support pour l'affirmation que des fonctions comme 'CInt' existent exclusivement pour la rétrocompatibilité ? Ils sont écrits comme n'importe quelle autre fonction dans le framework, et ajoutent simplement des fonctionnalités supplémentaires qui sont pratiques pour un débutant à vos méthodes "standard" 'Parse'. –
@Cody: Ils ne sont pas écrits comme toutes les autres fonctions du framework; Les fonctions spécifiques à VB sont "sans classe" (ce sont les seules "fonctions globales" disponibles). Ils ne font pas partie de la BCL et n'ont donc pas d'analogues précis dans d'autres langages .NET. Il n'y a aucune raison pour que le code non hérité utilise des fonctions spécifiques à une langue lorsque des choses comme 'Convert.ToInt32' existent. Je ne vois pas comment 'CInt' (à part être seulement quatre caractères) pourrait être plus simple à comprendre que' Convert.ToInt32' ou 'Integer.Parse'. –