.net Switch语句和随机数:并非所有代码路径都返回一个值。我必须包含默认值吗?

时间:2013-05-17 09:42:01

标签: c# .net random switch-statement

这是一个微小的函数,可以随机返回+1或-1

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

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

        case 1:
            return 1;
    }               
} 

编译器告诉我并非所有代码路径都返回一个值。至于我担心其不可能有机会不是0或1。

您是否必须始终包含这样的switch语句的默认大小写以进行编译?

4 个答案:

答案 0 :(得分:8)

这可能有点简单:

return chance == 0 ? -1: 1;

答案 1 :(得分:5)

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

因此,是的,您必须在return之外提供默认值或switch

答案 2 :(得分: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.");
} 

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

答案 3 :(得分:1)

编译器无法猜测你上面做了什么。真的,你可以将重构代码变得更干净,更安全。像

这样的东西
public static int PlusOrMinus()
{
    int chance = MyRandom.Random.Next(0, 2);

    return chance == 0 ? -1 : 1;
}