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;
        }
    }
}
29
demandé sur Steven 2014-01-18 00:47:33

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
}
65
répondu GlenH7 2014-01-18 14:01:12

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.

8
répondu Guffa 2014-01-17 21:48:39

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.

6
répondu Evert 2014-07-27 14:47:14

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; 
      }

}
3
répondu DareDevil 2014-02-05 12:25:49

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.

2
répondu Sinaesthetic 2014-01-27 06:29:35

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);
}
1
répondu netfed 2014-01-18 23:06:23
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

1
répondu Douglas Pettersson 2017-06-01 13:16:31

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.

0
répondu webdev5 2018-09-13 17:37:02