我正在尝试编写返回给定整数是否可以被 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;
}
}
}
您缺少
return
声明。
当编译器查看您的代码时,它会看到可能发生但不返回值的第三条路径(您没有为其编写代码的
else
)。 因此not all code paths return a value
。
对于我建议的修复,我在循环结束后放置了
return
。 另一个明显的点 - 将具有 else
值的 return
添加到 if-else-if
- 将打破 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
}
编译器无法获取您在循环的最后一次迭代中返回的复杂逻辑,因此它认为您可以退出循环并最终根本不返回任何内容。
不在最后一次迭代中返回,而是在循环后返回 true :
public static bool isTwenty(int num) {
for(int j = 1; j <= 20; j++) {
if(num % j != 0) {
return false;
}
}
return true;
}
注,原代码存在逻辑错误。您正在检查最后一个条件中的 if
num == 20
,但您应该检查 if j == 20
。还要检查 num % j == 0
是否多余,因为当你到达那里时总是如此。
我也遇到过这个问题,发现简单的解决方案是
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
}
这也适用于其他返回类型,并且问题最少
我选择的初始值是后备值,我可以根据需要多次重新分配该值。
我喜欢打败死马,但我只想补充一点:
首先,问题是控制结构的所有条件并未得到解决。本质上,你是说如果a,那么这个,否则如果b,那么这个。结尾。但如果两者都没有呢?无法退出(即并非每个“路径”都会返回值)。
我的另一点是,这是一个示例,说明为什么您应该尽可能争取单一退出。在此示例中,您将执行以下操作:
bool result = false;
if(conditionA)
{
DoThings();
result = true;
}
else if(conditionB)
{
result = false;
}
else if(conditionC)
{
DoThings();
result = true;
}
return result;
所以在这里,你总是有一个 return 语句,并且该方法总是在一处退出。但需要考虑一些事情......您需要确保您的退出值在每条路径上都有效或至少可以接受。例如,这个决策结构仅考虑了三种可能性,但单个出口也可以充当最终的 else 语句。或者确实如此?您需要确保最终返回值在所有路径上都有效。与拥有 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;
}
}
}
看看这个。它是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);
}
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();
}
}
这应该可行,否则我会收到并非所有代码路径都返回值的错误。因此,我将结果设置为返回值,根据哪个为 true,将其设置为 B 或 A
并非所有代码路径都会返回值。
解决方案:要解决该错误,请确保从函数中的所有代码路径返回一个值,或者在 tsconfig.json 文件中将 noImplicitReturns 设置为 false。
public class Customer Repository
{
public Customer Retrieve(int customerID)
{
//Create the instance of the Customer class //Pass in the requested ID
Customer customer = new Customer(customerID);
//Code for retrieving the defined customer
//Temporary hard-coded values to return //Example of a populated customer if (customerID == 1)
{
customer.EmailAdrress = "[email protected]";
customer.FirstName = "Bobo";
customer.LastName = "Smard";
return customer;
}
public bool Save(Customer customer)
{
return true;
}
}