1
votes

Pourquoi TryParse () ne fonctionne-t-il pas lorsque j'essaye de convertir une chaîne en un entier?

Je suis un étudiant débutant et j'ai un devoir à faire avec des structures, j'utilise également Visual Studio 2017.

J'ai créé une structure et maintenant j'essaye d'assigner l'entrée d'une zone de texte à un champ d'un instance de la structure créée. J'essaie d'attribuer une chaîne d'une zone de texte à un champ du type de données int de la structure que j'ai créée.

Lorsque j'essaie de convertir la chaîne de la zone de texte en utilisant la méthode TryParse (), cela ne fonctionne pas. VS me dit que le nom 'varName' n'existe pas dans le contexte actuel. Qu'est-ce que ça veut dire? Comment puis-je résoudre ce problème?

     enum Month
        {
            January, February, March, April, May, June, July, August, September, October, November, December
        }

        struct Person
        {
            public string name;

            public string jobTitle;

            public Month month;

            public int day;

            public int year;
        }

        private void submitButton_Click(object sender, EventArgs e)
        {

            Month month = (Month)Enum.Parse(typeof(Month), monthDropDown.Text);
            Person user;

            user.name = nameTextBox.Text;
            user.jobTitle = jobTitleTextBox.Text;
            user.month = month;
            user.day = int.TryParse(dayTxtBox.Text, out day); //here I'm trying to use the TryParse method but it gives me the error the name 'day' doesn't exist in the current context
            user.year = int.TryParse(yearTextBox.Text, out year); //here I'm trying to use the TryParse method but it gives me the error the name 'year' doesn't exist in the current context
        }


7 commentaires

Est-ce que user.day = int.TryParse (dayTxtBox.Text, out var day); fonctionne?


@nvoigt: C'est gentil de votre part de retirer (C #) la fin du titre, mais c'est toujours faux à 100%. La conversion est string-> int, pas int-> string, et la fonction tentée est TryParse , pas ToString . On se demande si l'enveloppe d'une question précédente a été réutilisée ou quelque chose comme ça.


@ChristianBerumen, Comment avez-vous trouvé ce titre? Cela ne correspond en aucun cas à votre question.


@BenVoigt Ops, bonne prise.


OT une structure avec des champs mutables n'est pas le meilleur choix de conception. Mieux vaut en faire une classe


Pouvons-nous confirmer s'il s'agit de Winforms? Droit?


@JeremyThompson, c'est winforms.


3 Réponses :


1
votes

Vous devez déclarer les variables que vous souhaitez utiliser comme paramètre out dans la méthode TryParse

Dans votre cas, vous avez utilisé out day code > et out year mais vous devez indiquer au compilateur le type de variable day et year .

Vous peut utiliser l'opérateur ternaire, si votre saisie réussit à analyser, il renvoie la valeur analysée à user.day et user.year sinon renvoie simplement 0.

if (int.TryParse(dayTxtBox.Text, out int day))
{
    user.day = day;
}
else
{
    user.day = 0; //Or set any value whatever you want when parsing fail
}

Ou plus simplement avec le bloc if .... else ,

user.day = int.TryParse(dayTxtBox.Text, out int day) ? day : 0;
user.year = int.TryParse(yearTextBox.Text, out int year) ? year : 0;


8 commentaires

Il ne renvoie pas la valeur par défaut. Comment sauriez-vous qu'il a échoué alors, car la valeur par défaut est une entrée valide?


@nvoigt, si vous passez des valeurs qui ne sont pas des nombres entiers comme xyz alors votre paramètre out vous donnera une valeur initialisée de int comme 0


Ah non? Veuillez coller votre code dans Visual Studio et corriger les erreurs évidentes du compilateur.


Et les raisons pour lesquelles toutes ces méthodes Try ... ne fonctionnent pas de cette façon est que vous ne sauriez pas faire la différence entre la saisie utilisateur de "0" et "erreur" , l'un étant valide et l'autre non.


@nvoigt: Le paramètre out est définitivement attribué, que la fonction renvoie true ou false . Le compilateur ne vous laissera pas revenir normalement (vous pouvez lancer ) une fonction avec un paramètre out sans l'avoir assigné.


@BenVoigt Je n'en doute pas. C'est juste que default (int) car la valeur des paramètres de sortie n'est pas une indication d'échec, seule la valeur de retour indique réellement si elle a échoué ou non. Il n'y a aucun moyen de savoir si le paramètre out a été défini sur default (int) en raison d'un échec ou sur 0 en cas de succès.


@BenVoigt Vous voudrez peut-être regarder la réponse au moment de mon commentaire, je parlais littéralement de la valeur de retour, pas du paramètre out dans mes premier et deuxième commentaires.


Ah, le libellé du commentaire d'er-sho (le paramètre out vous donnera une valeur initialisée, true) ne reflétait pas fidèlement la version précédente de la réponse (en attendant la valeur "initiale" du out - il n'y en a pas, ref est nécessaire - à renvoyer). Quoi qu'il en soit, la logique de la réponse actuelle pourrait être accomplie plus simplement par int.TryParse (dayTxtBox.Text, out user.day);



4
votes

2 commentaires

Je ne suis pas d'accord, je ne voterai pas contre ou quoi que ce soit, mais c'est une mauvaise utilisation de la conception de l'interface utilisateur. Même si mon conseil sur un calendrier n'est pas disponible, une liste déroulante avec 28, 29, 30 et 31 éléments en fonction du mois est le WTG car il n'a pas besoin de validation.


@JeremyThompson vous réalisez que c'est un devoir, n'est-ce pas? Nous ne parlons pas ici de conception d’interface utilisateur, il s’agit d’erreurs de base du compilateur. Vous avez raison, mais vous avez probablement 6 mois d'avance sur le cours des OP et demander aux gens de sauter au lieu de suivre le cours n'est pas utile.



0
votes

Je pourrais vous donner du code mais la meilleure solution est d'utiliser un contrôle que vous n'avez pas besoin de valider. Taper un jour dans une zone de texte est tellement des années 1990.

Il vaut mieux que je recommande un contrôle de calendrier lié à un DateHeure theDate {get; ensemble; Champ} .


2 commentaires

Bien que cela soit vrai, je ne peux pas imaginer que cela soit très utile pour une question qui est évidemment artificiellement contrainte à ce avec quoi le PO travaille actuellement. Vous ne savez même pas quelle technologie d'interface utilisateur ils utilisent et si un contrôle de calendrier pouvant être lié est disponible.


@nvoight private void submitButton_Click (expéditeur d'objet, EventArgs e) permet d'assumer assez facilement WimForms ou Asp.Net WebFroms.