C # Compiler-fout: “Niet alle codepaden retourneren een waarde”

Ik probeer een code te schrijven die zich terugkeert of een gegeven geheel al dan niet gelijkwaardig is met 1 tot 20, maar ik ontvang de volgende foutmelding:

FOUT CS0161: ‘PROBLEEMFIVE.ISTWAY (INT)’: niet alle codepaden retourneren een waarde

Hier is mijn 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;
        }
    }
}

Antwoord 1, Autoriteit 100%

U Mist A returnVerklaring.

Wanneer de compiler naar uw code kijkt, ziet het een derde pad (de elsewaarvoor u niet codeert) die kan optreden, maar retourneert niet een waarde. Vandaar not all code paths return a value.

Voor mijn gesuggereerde oplossing, heb ik een returnNadat je lus eindigt. De andere voor de hand liggende plek – het toevoegen van een elsemet een returnwaarde naar de if-else-if– zou de forLoop.

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
}

Antwoord 2, Autoriteit 10%

De compiler krijgt niet de ingewikkelde logica waarin je terugkeert in de laatste iteratie van de lus, dus hij denkt dat je de lus kunt verlaten en uiteindelijk helemaal niets teruggeeft.

In plaats van terug te keren in de laatste iteratie, retourneer je gewoon true na de lus:

public static bool isTwenty(int num) {
  for(int j = 1; j <= 20; j++) {
    if(num % j != 0) {
      return false;
    }
  }
  return true;
}

Kanttekening, er zit een logische fout in de originele code. U controleert if num == 20in de laatste voorwaarde, maar u had moeten controleren if j == 20. Controleer ook of num % j == 0overbodig was, want dat is altijd zo als je er bent.


Antwoord 3, autoriteit 8%

Ik heb dit probleem ook ervaren en vond de gemakkelijke oplossing

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
}

Dit werkt ook met andere retourtypes en geeft de minste problemen

De initiële waarde die ik koos was een terugvalwaarde en ik kon de waarde zo vaak als nodig opnieuw toewijzen.


Antwoord 4, autoriteit 6%

Ik vind het leuk om dode paarden te verslaan, maar ik wilde nog een extra punt maken:

Ten eerste is het probleem dat niet aan alle voorwaarden van uw controlestructuur is voldaan. In wezen zeg je als a, dan dit, anders als b, dan dit. Einde. Maar wat als geen van beide? Er is geen manier om af te sluiten (d.w.z. niet elk ‘pad’ retourneert een waarde).

Mijn aanvullende punt is dat dit een voorbeeld is van waarom je zou moeten streven naar een enkele exit, indien mogelijk. In dit voorbeeld zou je zoiets als dit doen:

bool result = false;
if(conditionA)
{
   DoThings();
   result = true;
}
else if(conditionB)
{
   result = false;
}
else if(conditionC)
{
   DoThings();
   result = true;
}
return result;

Dus hier heb je altijd een return-statement en eindigt de methode altijd op één plek. Een paar dingen om te overwegen … je moet ervoor zorgen dat je exit-waarde geldig is op elk pad of op zijn minst acceptabel is. Deze beslissingsstructuur houdt bijvoorbeeld rekening met drie mogelijkheden, maar de enkele exit kan ook fungeren als uw definitieve andersverklaring. Of doet het dat? U moet ervoor zorgen dat de uiteindelijke retourwaarde geldig is op alle paden. Dit is een veel betere manier om het te benaderen dan 50 miljoen exitpunten te hebben.


Antwoord 5, autoriteit 3%

Of doe gewoon deze dingen:

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

Antwoord 6

Kijk eens naar deze. Het is de Ternary-operator in C#.

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

Dit is alleen om het principe te laten zien; je kunt True of False (of zelfs integer of string) retourneren, afhankelijk van de uitkomst van iets aan de linkerkant van het vraagteken. Leuke uitbater, dit.

Drie alternatieven samen:

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

Nog korter:

public bool test3()
{
    int num = 20;
    return (bool)(num % 3 != 0);
}

Antwoord 7

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

Dit zou moeten werken, anders kreeg ik de fout dat niet alle codepaths een waarde retourneren. Daarom stel ik het resultaat in als de geretourneerde waarde, die is ingesteld als B of A, afhankelijk van wat waar is


Antwoord 8

Dit gebeurt mij meestal als ik een retourverklaring misplaats, bijvoorbeeld:

Het toevoegen van een return-statement, of in mijn geval, het verplaatsen naar het juiste bereik zal de slag doen:

Other episodes