并非所有代码路径都返回一个值,但无论如何都有值返回

时间:2017-10-18 15:23:36

标签: c#

我刚刚学会了方法声明并且我不太了解如何使用它,我试图制作一个算法,它需要2个数字并返回它们最小的公共分频,如果没有公共分频器,则返回 - 1,那就是代码:

    class Program
    {
        static int Div(int a, int b)
        {
            int max = Math.Max(a, b);
            bool div = false;
            for(int i = 2; i <= max / 2; i++)
            {
                if (a % i == 0 && b % i == 0)
                {
                    return i;
                    div = true;
                    i = max;
                }

            }
            if (div == false)
            {
                return -1;
            }
        }

        static void Main(string[] args)
        {
             Console.WriteLine("Please Enter 2 Numbers");
             int num = int.Parse(Console.ReadLine());
            int num2 = int.Parse(Console.ReadLine());
            Console.WriteLine(Div(num, num2));

        }
    }

它告诉我有一个无法访问的代码,并非所有代码路径都返回一个值,但为什么呢?如果我得到2个确实有一个公共分频器的数字它将返回它,如果不是它将返回-1,我认为没有任何执行,提前感谢

6 个答案:

答案 0 :(得分:3)

编译器不够聪明。但是最后if仍然是多余的,因为它总是false,所以你可以编写以下内容,这也可以避免编译错误:

static int Div(int a, int b)
{
    int max = Math.Max(a, b);

    for (int i = 2; i <= max / 2; i++)
    {
        if (a % i == 0 && b % i == 0)
        {
            return i;
        }
    }
    return -1;
}

循环中return之后的部分无法访问且不必要,所以我已将其删除。

答案 1 :(得分:0)

当您使用return时立即退出该功能,超出该行的代码将无法执行,因此无法访问该行。

return i;
div = true; <<
i = max; <<

在您的情况下,您似乎只想在返回之前设置这些值。

答案 2 :(得分:0)

if (a % i == 0 && b % i == 0)
{
    return i;
    div = true;
    i = max;
}

永远不会到达返回后的2行。在返回前把它们放好。另外我认为你根本不需要div bool。这是多余的,可以进行优化。

答案 3 :(得分:0)

证明任意方法是否可以在不命中return或抛出异常的情况下到达方法的末尾,这可能是一个无法解决的问题。如果你足够努力,你总是可以构造一个方法,使编译器无法证明端点是否可以访问。但是,编译器不允许任何具有返回值但没有可达端点的程序很重要。

因此,存在误报。编译器最好确定程序是否具有可访问的端点,如果它无法证明它,即使您和我都知道端点实际上不可访问,它也会出错。

您需要更改代码,以便编译器能够证明端点不可访问,最简单的方法是删除if (div == false)行并且只是总是return -1;。你和我知道那里div永远不会成真,但编译器不够复杂,无法证明它。

答案 4 :(得分:0)

for循环中第一个if子句的返回位于代码的其余部分之前,因此有两行代码永远不会被命中,这两个代码:

SpecificationError: Function names must be unique, found multiple named <lambda>

他们永远不会被击中的原因是因为if if语句是真的,它会立即返回,如果它是假的,它会转到第二个if。 / p>

答案 5 :(得分:0)

2个原因:行div = true无法访问,返回后的代码不执行。取代

return i;
div = true;
i = max;

通过

int res=i;
div = true;
i = max;
return res;

最后一个&#39; if&#39;条款没有&#39;否则&#39;允许在所有情况下返回的条款;