c# erro de retorno "nem todos os caminhos de código retornam um valor"
estou a tentar escrever um código que devolve se um dado inteiro é divisível uniformemente por 1 a 20,
mas continuo a receber o seguinte erro:
Aqui está o meu código:erro CS0161: 'ProblemFive.isTwenty (int)": nem todos os caminhos de código devolvem um valor
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 answers
Quando o compilador olha para o seu código, vê um terceiro caminho (o else
para o qual você não codifica) que pode ocorrer mas não devolve um valor. Daí not all code paths return a value
.
else
que tinha um valor return
para o if-else-if
- quebraria o laço 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 tem a lógica intrincada onde você retorna na última iteração do loop, então ele acha que você pode sair do loop e acabar não devolvendo nada de todo.
Em vez de voltar na última iteração, apenas retorne verdadeiro 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 de lado, há um erro lógico no código original. Está a verificar se num == 20
na última condição, mas devia ter verificado se j == 20
. Também a verificar se num % j == 0
era superflous, pois que é sempre verdade quando se chega lá.
Eu também experimentei este problema e encontrei a solução fácil para 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
}
Isto também funciona com outros tipos de retorno e dá a menor quantidade de problemas
O valor inicial que escolhi foi um valor de retorno e fui capaz de atribuir o valor tantas vezes quanto necessário.
Ou simplesmente fazer estas coisas:
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;
}
}
O meu ponto adicional é que este é um exemplo de porque você deve apontar para uma única saída, se possível. Neste exemplo você faria algo do género:
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 uma declaração de retorno e o método sempre sai em um lugar. Mas há algumas coisas a considerar... você precisa se certificar de que seu valor de saída é válido em todos os caminhos ou pelo menos aceitável. Por exemplo, esta estrutura de decisão representa apenas três possibilidades, mas a saída única também pode funcionar como a sua última declaração. Ou será? Você precisa se certificar de que o valor final de retorno é válido em todos os caminhos. Esta é uma maneira muito melhor. aproximar-se contra ter 50 milhões de pontos de saída.
bool BooleanValue = (num % 3 != 0) ? true : false;
Isto é apenas para mostrar o princípio; você pode retornar verdadeiro ou falso (ou mesmo inteiro ou string) dependendo do resultado de algo no lado esquerdo do ponto de interrogação. Belo operador, este.
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();
}
}
Isto deve funcionar, caso contrário tenho o erro de que nem todos os codepaths devolvem um valor. Para isso, defini o resultado como o valor devolvido, que é definido como B ou A dependendo do que é verdadeiro