0

Heres a tiny function to randomly return either +1 or -1

public static int PlusOrMinus()
{
    int chance = MyRandom.Random.Next(0, 2);

    switch (chance)
    {
        case 0:
            return -1;

        case 1:
            return 1;
    }               
} 

Compiler is telling me not all code paths return a value. As far as I'm concerned its impossible for chance not to be either 0 or 1.

Must you always include a default case for a switch statement like this to compile?

4

4 回答 4

8

这可能更简单一点:

return chance == 0 ? -1: 1;
于 2013-05-17T09:45:53.903 回答
5

编译器不会运行您的代码。因此,编译器无法知道定义的整数永远不会超出 0-1 的范围。

因此,是的,您必须提供默认值returnswitch.

于 2013-05-17T09:44:06.160 回答
2

为什么不生成 0 或 1,然后将 0 变成 -1?

var x = MyRandom.Random.Next(0, 2);
if (x == 0)
    return -1;
return x;

或者更简洁:

return MyRandom.Random.Next(0, 2) == 0 ? -1 : 1;

更新:为了回答你的问题,不,不必包括default,你也可以这样做:

public static int PlusOrMinus()
{
    int chance = MyRandom.Random.Next(0, 2);

    switch (chance)
    {
        case 0:
            return -1;

        case 1:
            return 1;
    }               

    throw new InvalidOperationException("Unreachable code.");
} 

但无论如何,编译器必须满足于所有执行路径要么返回一个值,要么抛出一个异常,不管是否知道其中一些路径永远不会真正执行。

于 2013-05-17T09:50:26.513 回答
1

编译器无法猜测您在上面做了什么。确实,您可以重构代码以使其更清洁、更安全。就像是

public static int PlusOrMinus()
{
    int chance = MyRandom.Random.Next(0, 2);

    return chance == 0 ? -1 : 1;
}
于 2013-05-17T09:49:18.167 回答