C# C“编译器错误:”;并非所有代码路径都返回一个值";
我试图编写返回给定整数是否可被1到20整除的代码,C# C“编译器错误:”;并非所有代码路径都返回一个值";,c#,return,code-analysis,C#,Return,Code Analysis,我试图编写返回给定整数是否可被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; }
但我一直收到以下错误: 错误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;
}
}
}
publicstaticboolstwenty(int-num)
{
对于(int j=1;j您缺少return
语句
当编译器查看您的代码时,它会看到第三条路径(您没有为其编码的其他路径
),该路径可能会出现,但不会返回值。因此并非所有代码路径都会返回值
对于我建议的修复方法,我在循环结束后放置了一个返回值
。另一个明显的点是,在if else if
中添加一个else
返回值的将打破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
}
publicstaticboolstwenty(int-num)
{
对于(int j=1;j,编译器无法获得在循环的最后一次迭代中返回的复杂逻辑,因此它认为可以退出循环,最终不返回任何内容
不要在最后一次迭代中返回,只需在循环后返回true:
public static bool isTwenty(int num) {
for(int j = 1; j <= 20; j++) {
if(num % j != 0) {
return false;
}
}
return true;
}
publicstaticboolstwenty(int-num){
对于(intj=1;j来看这个,它是C#中的三元运算符
这只是为了说明原理;根据问号左侧的结果,可以返回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);
}
我喜欢打败死马,但我只想补充一点:
首先,问题是并不是控制结构的所有条件都得到了解决。本质上,你说的是如果a,那么这个,否则如果b,那么这个。结束。但是如果两者都没有呢?没有退出的方法(即不是每个“路径”都返回一个值)
我的另一点是,这是一个例子,说明了如果可能的话,为什么你应该以单一出口为目标。在这个例子中,你可以这样做:
bool result = false;
if(conditionA)
{
DoThings();
result = true;
}
else if(conditionB)
{
result = false;
}
else if(conditionC)
{
DoThings();
result = true;
}
return result;
所以,这里总是有一个返回语句,这个方法总是在一个地方退出。但是要考虑两件事……你需要确保你的出口值在每个路径上是有效的或者至少是可接受的。例如,这个决策结构只考虑三种可能性,但单出口也可以作为你最后的选择。语句。还是这样?您需要确保最终返回值在所有路径上都有效。这是一种比拥有5000万个退出点更好的方法。
或者简单地执行以下操作:
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;
}
}
}
publicstaticboolstwenty(int-num)
{
对于(int j=1;j我也遇到了这个问题,并发现简单的解决方法是
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
}
这也适用于其他返回类型,并且问题最少
我选择的初始值是一个回退值,我可以根据需要多次重新分配该值。class Program
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();
}
}
{
double[]a=新的double[]{1,3,4,8,21,38};
double[]b=新的double[]{1,7,19,3,2,24};
双[]结果;
公共双[]检查排序()
{
for(int i=1;i
这应该可以工作,否则我会得到一个错误,即并非所有代码路径都返回一个值。因此,我将结果设置为返回值,根据哪个值为真,将其设置为B或a。如果我放错了return语句,这通常会发生在我身上,例如:
添加一个return语句,或者在我的例子中,将其移动到正确的作用域,就可以做到这一点:
您的代码没有意义,但错误信息非常清楚。即使在20次迭代中两个if条件都为false,您也需要返回一个值。您像人一样思考,而不是像编译器一样思考。编译器不知道您在想什么,也不知道逻辑应该如何流动(经过优化)。如果值与“if”或“if”不匹配,会发生什么情况?这将为isTwenty(44696171520)返回错误的结果
。它应该返回true
,因为它可以被所有数字1到20平分,但它返回false
。事实上,它总是返回false
,因为它永远不会进入返回true
@Guffa的状态-我认为,因为这个问题似乎是GlenH7正在做的家庭作业e在不修复逻辑错误的情况下获得要编译的代码的最小值。另一个可以揭示逻辑错误并帮助该学生学习的选项是抛出一个异常,而不是返回一个可能错误的值。@Guffa-我有点不好意思地承认,我没有试图破译函数的其余部分,只是专注于OP提到的错误。我同样被OP的逻辑表达式难住了但我选择了忽略这一点,而选择回答被问到的问题。这“打破”了(极有疑问)OP代码的逻辑是,这将始终在循环的第一次迭代中返回。最好使用文字代码而不是图像-如果视力受损的用户正在使用该网站,他们不能使用TTS阅读此答案,但如果您以文本形式复制代码,他们可以。
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();
}
}