【问题标题】:.net Switch statement and random number: Not all code paths return a value. Must I include a default?.net Switch 语句和随机数:并非所有代码路径都返回值。我必须包含默认值吗?
【发布时间】:2013-05-17 09:42:01
【问题描述】:

这是一个随机返回 +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 语句包含一个默认情况才能编译吗?

【问题讨论】:

  • 编译器不知道这是不可能的!你总是需要一个默认值。
  • @Rikalous 你不需要默认值,return 语句可以在 switch 之外。
  • 当然可以换成return MyRandom.Random.Next(0,2) == 0 : ? -1 : 1;

标签: c# .net random switch-statement


【解决方案1】:

这可能会简单一点:

return chance == 0 ? -1: 1;

【讨论】:

【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    为什么不生成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.");
    } 
    

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-05
        • 2011-12-17
        • 1970-01-01
        相关资源
        最近更新 更多