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

本文关键字:返回值 路径 包含 默认值 代码 语句 随机数 net | 更新日期: 2023-09-27 18:13:57

这里有一个小函数,随机返回+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语句,必须总是包含一个默认的case来编译吗?

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

这可能更简单一些:

return chance == 0 ? -1: 1;

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

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

为什么不生成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;

UPDATE:回答你的问题,不,你没有包含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.");
} 

但是在任何情况下,编译器必须满足所有的执行路径要么返回一个值,要么抛出一个异常,无论是否知道其中一些路径实际上永远不会执行。

编译器无法猜出您在上面做了什么。真的,你可以重构你的代码,让它更干净、更安全。就像

public static int PlusOrMinus()
{
    int chance = MyRandom.Random.Next(0, 2);
    return chance == 0 ? -1 : 1;
}