web-dev-qa-db-fra.com

c # erreur de retour "tous les chemins de code ne renvoient pas de valeur"

J'essaie d'écrire du code qui retourne si un entier donné est divisible de manière égale 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;
        }
    }
}
33
user115185

Vous manquez une déclaration return.

Lorsque le compilateur examine votre code, il voit un troisième chemin (la else pour laquelle vous n'avez pas codé) qui peut se produire mais ne renvoie pas de valeur. D'où not all code paths return a value

Pour ma solution suggérée, je mets une return après la fin de votre boucle. L’autre point évident - ajouter une else ayant une valeur return au if-else-if - romprait 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
}
69
GlenH7

Le compilateur n'obtient pas la logique complexe dans laquelle vous revenez dans la dernière itération de la boucle. Il pense donc que vous pouvez sortir de la boucle et ne rien renvoyer.

Au lieu de revenir à 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;
}

Remarque secondaire, il y a une erreur logique dans le code d'origine. Vous vérifiez si num == 20 est dans la dernière condition, mais vous auriez dû vérifier si j == 20. Vérifier également si num % j == 0 était superflous, car cela est toujours vrai quand vous y arrivez.

8
Guffa

J'ai également rencontré ce problème et trouvé la solution facile

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 secours et j'ai pu réaffecter la valeur autant de fois que nécessaire.

6
Evert

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
DareDevil

J'aime battre les chevaux morts, mais je voulais juste ajouter 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é traitées. Essentiellement, vous dites que si a, alors ceci, sinon si b, alors ceci. Fin. Mais que faire si ni? Il n’existe aucun moyen de quitter (c’est-à-dire que tous les chemins ne renvoient pas de valeur).

Mon point supplémentaire est que ceci est un exemple de la raison pour laquelle 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 déclaration de retour et la méthode est toujours au même endroit. Quelques éléments à prendre en compte cependant ... vous devez vous assurer que votre valeur de sortie est valide sur tous les chemins ou au moins, acceptable. Par exemple, cette structure de décision ne représente que trois possibilités, mais la sortie unique peut également servir d’instruction finale. Ou le fait-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 que d'avoir 50 millions de points de sortie.

3
Sinaesthetic

Jetez un coup d'oeil à celui-ci. C'est l'opérateur ternaire en C #. 

bool BooleanValue = (num % 3 != 0) ? true : false;

Ceci est juste pour montrer le principe; vous pouvez renvoyer True ou False (ou même un entier ou une chaîne) en fonction du résultat obtenu à gauche du point d'interrogation. Bel opérateur, ça. 

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
netfed
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 l'erreur que tous les codepaths ne retournent pas une valeur. Par conséquent, j’ai défini le résultat comme valeur renvoyée, qui est définie sur B ou A en fonction de la valeur vraie

1

J'ai eu cette erreur en essayant d'ouvrir un projet VS 2017 dans VS 2015. Bien entendu, la solution devait ouvrir en 2017.

0
webdev5