c # erreur de retour "tous les chemins de code ne renvoient pas de valeur"
J'essaie d'écrire du code qui renvoie si oui ou non un entier donné est divisible uniformément par 1 à 20,
mais je continue à recevoir l'erreur suivante:
Erreur CS0161: 'ProblemFive.isTwenty (int)': tous les chemins de code ne renvoient pas de valeur
Voici mon code:
public static bool isTwenty(int num)
{
for(int j = 1; j <= 20; j++)
{
if(num % j != 0)
{
return false;
}
else if(num % j == 0 && num == 20)
{
return true;
}
}
}
8 réponses
Il vous manque une instruction return
.
Lorsque le compilateur regarde votre code, il voit un troisième chemin (le else
pour lequel vous n'avez pas codé) qui pourrait se produire mais ne renvoie pas de valeur. D'où not all code paths return a value
.
Pour mon correctif suggéré, je mets un return
après la fin de votre boucle. L'autre point évident-ajouter un {[2] } qui avait une valeur return
à la if-else-if
- casserait la boucle for
.
public static bool isTwenty(int num)
{
for(int j = 1; j <= 20; j++)
{
if(num % j != 0)
{
return false;
}
else if(num % j == 0 && num == 20)
{
return true;
}
}
return false; //This is your missing statement
}
Le compilateur n'obtient pas la logique complexe où vous revenez dans la dernière itération de la boucle, donc il pense que vous pourriez sortir de la boucle et finir par ne rien retourner du tout.
Au lieu de retourner dans la dernière itération, il suffit de retourner true après la boucle:
public static bool isTwenty(int num) {
for(int j = 1; j <= 20; j++) {
if(num % j != 0) {
return false;
}
}
return true;
}
Note de côté, il y a une erreur logique dans le code d'origine. Vous vérifiez si num == 20
dans la dernière condition, mais vous devez vérifier si j == 20
. Vérifier également si num % j == 0
était superflous, comme c'est toujours vrai quand vous y arrivez.
J'ai aussi rencontré ce problème et trouvé la solution facile pour être
public string ReturnValues()
{
string _var = ""; // Setting an innitial value
if (.....) // Looking at conditions
{
_var = "true"; // Re-assign the value of _var
}
return _var; // Return the value of var
}
Cela fonctionne également avec d'autres types de retour et donne le moins de problèmes
La valeur initiale que j'ai choisie était une valeur de repli et j'ai pu réattribuer la valeur autant de fois que nécessaire.
Ou simplement faire ce genre de choses:
public static bool isTwenty(int num)
{
for(int j = 1; j <= 20; j++)
{
if(num % j != 0)
{
return false;
}
else if(num % j == 0 && num == 20)
{
return true;
}
else
return false;
}
}
J'aime battre les chevaux morts, mais je voulais juste faire un point supplémentaire:
Tout d'abord, le problème est que toutes les conditions de votre structure de contrôle n'ont pas été abordées. Essentiellement, vous dites si a, alors ceci, sinon si b, alors ceci. Fin. Mais que faire si aucune? Il n'y a aucun moyen de quitter (c'est-à-dire que tous les 'path' ne renvoient pas de valeur).
Mon point supplémentaire est que c'est un exemple de pourquoi vous devriez viser une sortie unique si possible. Dans cet exemple vous feriez quelque chose comme ceci:
bool result = false;
if(conditionA)
{
DoThings();
result = true;
}
else if(conditionB)
{
result = false;
}
else if(conditionC)
{
DoThings();
result = true;
}
return result;
Donc ici, vous avez toujours une instruction return et la méthode se termine toujours au même endroit. Quelques choses à considérer cependant... vous devez vous assurer que votre valeur de sortie est valide sur chaque chemin ou au moins acceptable. Par exemple, cette structure de décision ne tient compte que de trois possibilités, mais la sortie unique peut également agir comme votre déclaration finale else. Ou est-il? Vous devez vous assurer que la valeur de retour finale est valide sur tous les chemins. C'est une bien meilleure façon de l'aborder il par rapport à avoir 50 millions de points de sortie.
Jetez un oeil à celui-ci. C'est l'opérateur Ternaire en C#.
bool BooleanValue = (num % 3 != 0) ? true : false;
C'est juste pour montrer le principe; vous pouvez retourner True ou False (ou même entier ou chaîne) en fonction du résultat de quelque chose sur le côté gauche du point d'interrogation. Nice opérateur, cette.
Trois alternatives ensemble:
public bool test1()
{
int num = 21;
bool BooleanValue = (num % 3 != 0) ? true : false;
return BooleanValue;
}
public bool test2()
{
int num = 20;
bool test = (num % 3 != 0);
return test;
}
Encore Plus Court:
public bool test3()
{
int num = 20;
return (bool)(num % 3 != 0);
}
class Program
{
double[] a = new double[] { 1, 3, 4, 8, 21, 38 };
double[] b = new double[] { 1, 7, 19, 3, 2, 24 };
double[] result;
public double[] CheckSorting()
{
for(int i = 1; i < a.Length; i++)
{
if (a[i] < a[i - 1])
result = b;
else
result = a;
}
return result;
}
static void Main(string[] args)
{
Program checkSorting = new Program();
checkSorting.CheckSorting();
Console.ReadLine();
}
}
Cela devrait fonctionner, sinon j'ai eu l'erreur que tous les codepaths ne renvoient pas de valeur. Par conséquent, je définis le résultat comme la valeur renvoyée, qui est définie comme B ou A en fonction de ce qui est vrai
J'ai eu cette erreur en essayant d'ouvrir un projet VS 2017 dans VS 2015. Bien sûr, la solution était d'ouvrir en 2017.