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 }
3 Réponses :
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;
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);
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.
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}
.
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.
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 estTryParse
, pasToString
. 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.