我正在尝试编写代码,返回给定的整数是否可以被1到20均分,但是我一直收到以下错误:
错误CS0161:'ProblemFive.isTwenty(int)':并非所有代码路径都返回值
这是我的代码:
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;
}
}
}
答案 0 :(得分:71)
您错过了return
声明。
当编译器查看您的代码时,它会看到可能发生但不返回值的第三条路径(您未编码的else
)。因此not all code paths return a value
。
对于我的建议修复,我在循环结束后放了一个return
。另一个显而易见的地方 - 向else
添加return
if-else-if
的{{1}}会破坏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
}
答案 1 :(得分:8)
编译器没有得到你在循环的最后一次迭代中返回的错综复杂的逻辑,所以它认为你可以退出循环并最终没有返回任何东西。
不是在最后一次迭代中返回,而是在循环后返回true:
public static bool isTwenty(int num) {
for(int j = 1; j <= 20; j++) {
if(num % j != 0) {
return false;
}
}
return true;
}
旁注,原始代码中存在逻辑错误。您正在检查上一个条件中是否为num == 20
,但您应该检查j == 20
是否为num % j == 0
。还要检查{{1}}是否超级丰富,因为当你到达那里时总是如此。
答案 2 :(得分:6)
我也遇到了这个问题,并找到了简单的解决方案
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
}
这也适用于其他返回类型,并且提供的问题最少
我选择的初始值是一个后备值,我能够根据需要重新分配该值。
答案 3 :(得分:3)
我喜欢打死马,但我只是想补充一点:
首先,问题是并非所有控制结构的条件都已得到解决。基本上,你是说a,然后这个,否则如果b,那么这个。结束。但如果两者都没有呢?没有办法退出(即并非每个'path'都返回一个值)。
我的另一点是,这是一个例子,说明为什么你应该在可能的情况下瞄准单一出口。在这个例子中,你会做这样的事情:
bool result = false;
if(conditionA)
{
DoThings();
result = true;
}
else if(conditionB)
{
result = false;
}
else if(conditionC)
{
DoThings();
result = true;
}
return result;
所以在这里,你总是一个return语句,并且该方法总是在一个地方退出。需要考虑的几件事情......你需要确保退出值在每条路径上都有效或至少是可接受的。例如,此决策结构仅考虑三种可能性,但单一退出也可以作为您的最终else语句。或者是吗?您需要确保最终返回值在所有路径上都有效。这是一个更好的方法来接近它,而不是有5000万个退出点。
答案 4 :(得分:3)
或者只是做这个东西:
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;
}
}
答案 5 :(得分:1)
看一下这个。它是C#中的三元运算符。
bool BooleanValue = (num % 3 != 0) ? true : false;
这只是为了说明原则;您可以返回True或False(甚至整数或字符串),具体取决于问号左侧的结果。好运营商,这个。
三个替代方案:
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;
}
更短:
public bool test3()
{
int num = 20;
return (bool)(num % 3 != 0);
}
答案 6 :(得分:1)
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();
}
}
这应该可以工作,否则我得到的错误是并非所有代码路径都返回一个值。因此我将结果设置为返回值,该值设置为B或A,具体取决于哪个为真
答案 7 :(得分:0)