c # retornando erro “nem todos os caminhos de código retornam um valor”

Eu estou tentando escrever código que retorna ou não um dado inteiro é divisível uniformemente por 1 a 20,
mas continuo recebendo o seguinte erro:

erro CS0161: ‘ProblemFive.isTwenty (int)’: nem todos os caminhos de código retornam um valor

Aqui está o meu código:

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

    Você está perdendo uma declaração de return .

    Quando o compilador olha para o seu código, ele vê um terceiro caminho (o else você não codificou) que poderia ocorrer, mas não retorna um valor. Portanto, not all code paths return a value .

    Para minha correção sugerida, coloco um return após o término do seu loop. O outro ponto óbvio – adicionando um else que tivesse um valor de return ao if-else-if – quebraria o loop 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 } 

    O compilador não obtém a intrincada lógica em que você retorna na última iteração do loop, então acha que você poderia sair do loop e acabar não retornando nada.

    Em vez de retornar na última iteração, retorne true após o loop:

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

    Nota lateral, há um erro lógico no código original. Você está checando se num == 20 na última condição, mas deveria ter verificado se j == 20 . Também verificar se num % j == 0 foi superfluosa, como isso é sempre verdade quando você chegar lá.

    Eu também experimentei este problema e encontrei a solução fácil de ser

     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 } 

    Isso também funciona com outros tipos de retorno e fornece a menor quantidade de problemas

    O valor inicial que escolhi foi um valor de fallback e consegui atribuir novamente o valor quantas vezes fosse necessário.

    Ou simplesmente faça isso:

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

    Eu gosto de bater em cavalos mortos, mas eu só queria fazer um ponto adicional:

    Em primeiro lugar, o problema é que nem todas as condições de sua estrutura de controle foram abordadas. Essencialmente, você está dizendo se a, então isso, senão se b, então isso. Fim. Mas e se nem? Não há como sair (ou seja, nem todo ‘caminho’ retorna um valor).

    Meu ponto adicional é que este é um exemplo de por que você deve procurar uma saída única, se possível. Neste exemplo, você faria algo assim:

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

    Então, aqui, você sempre retorna uma declaração e o método sempre sai em um só lugar. Algumas coisas a serem consideradas … você precisa ter certeza de que seu valor de saída é válido em todos os caminhos ou pelo menos aceitável. Por exemplo, essa estrutura de decisão considera apenas três possibilidades, mas a saída única também pode atuar como sua instrução final. Ou isso? Você precisa ter certeza de que o valor de retorno final é válido em todos os caminhos. Esta é uma maneira muito melhor de abordá-lo do que ter 50 milhões de pontos de saída.

    Dê uma olhada neste aqui. É o operador Ternary em C #.

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

    Isto é apenas para mostrar o princípio; você pode retornar True ou False (ou até mesmo inteiro ou string) dependendo do resultado de algo no lado esquerdo do ponto de interrogação. Bom operador, isso.

    Três alternativas juntas:

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

    Ainda mais curto:

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

    Isso deve funcionar, senão recebi o erro de que nem todos os caminhos de código retornam um valor. Por isso, eu definir o resultado como o valor retornado, que é definido como B ou A, dependendo de qual é a verdadeira