";检测到无法访问的代码”;C#中的错误消息

本文关键字:代码 错误 消息 访问 检测 quot | 更新日期: 2023-09-27 18:29:25

我正试图用C#编写一个程序,以确定一个数字是否是素数。我使用前两个if语句来挑出许多选项,然后我试图在最后一个else语句中嵌套一个循环,它告诉我存在"检测到的不可达代码"。

public static bool primeNumber ()
    {
        Console.Write ("Please enter a number to see if it is a prime number: ");
        int num = int.Parse (Console.ReadLine ());
        if (num % 2 == 0)
            return false;
        else if (num % 5 == 0)
            return false;
        else {
            for (int i = 3; i < num / 2; i += 2)
            {
                if (num % i == 0)
                    return false;
                else 
                    return true;
            }
        }
    }

";检测到无法访问的代码”;C#中的错误消息

这里有两个问题:

  • 无法访问的代码
  • 方法并非在所有情况下都返回值

返回值问题是一个错误,会阻止编译完成,而无法访问的代码只是一个警告。我所说的"只是"是指它不一定会停止您的编译,但您应该将其视为错误的指示。

让我写一个新的例子来说明这里的实际问题:

public static bool primeNumber (int num)
{
    for (int i = 0; i < num; i++)
    {
        if (i < 10)
            return false;
        else 
            return true;
    }
}

让我们看看这个方法的作用:

  1. 它开始循环
  2. 循环中的第一件事是检查一些东西
  3. 根据这个something,它会返回this或that。它返回

因此,它永远不会达到这一点:

for (int i = 0; i < num; i++)
                         ^^^

这是无法访问的代码。

其次,在您的情况下,编译器无法判断num是否总是一个允许循环运行的值,从而总是返回一些东西。因此,编译器认为有可能您有一个num(在我的例子中,它可能是-1)值,它将不允许循环运行,使程序跳过循环,因此我们最终会出现另一个错误,那么该方法应该返回什么?

如果我们回到您的代码,这里有一种重写方法的方法

public static bool primeNumber ()
{
    Console.Write ("Please enter a number to see if it is a prime number: ");
    int num = int.Parse (Console.ReadLine ());
    if (num % 2 == 0)
        return false;
    else if (num % 5 == 0)
        return false;
    else {
        for (int i = 3; i < num / 2; i += 2)
        {
            if (num % i == 0)
                return false;
        }
        return true;
    }
}
  • 如果我们找到了一个证明测试的数字(即它不是素数),通过在循环中只返回,我们将消除无法访问的代码问题
  • 然后,如果我们设法运行循环完成,我们无法证明它不是素数,因此它素数,然后我们返回true

意见:您不应该有功能来提示用户,然后返回答案。相反,我会写这个(LINQPad)程序:

void Main()
{
    Console.Write ("Please enter a number to see if it is a prime number: ");
    int num = int.Parse (Console.ReadLine ());
    if (primeNumber(num))
        Console.WriteLine(num + " is a prime number");
    else
        Console.WriteLine(num + " is a not prime number");
}
public static bool primeNumber (int num)
{
    if (num % 2 == 0)
        return false;
    else if (num % 5 == 0)
        return false;
    else {
        for (int i = 3; i < num / 2; i += 2)
        {
            if (num % i == 0)
                return false;
        }
        return true;
    }
}

您的for循环在这里什么都不做,因为它在第一次运行时返回,所以

i += 2

永远无法到达。

整个for循环相当于单个return true