unity3d Switch中的Switch [C# / Unity]并非所有代码路径都返回值

i5desfxk  于 2023-03-19  发布在  C#
关注(0)|答案(2)|浏览(188)

我想根据一个列表生成一些东西。
例如,我想生成一个17 / 21或25单位宽度的购物中心。
然后,我将产卵3商店内的购物中心。
我希望一个方法(GStoreDis)将返回一个3个相应号码的列表,当我用25 /21/17调用该方法时。
17个单位宽度的商场
1.布局1(10、5、2)
1.布局2(7、5、5)
21个单位宽度的商场
1.布局1(10、6、5)
1.布局2(7、7、7)
25个单位宽度的商场
1.布局1(10、10、5)
1.布局2(9、8、8)

private List<int> GStoreDis(int StoreBlockLength)
    {
        switch (StoreBlockLength)
        {
            case 25:

                switch (Random.Range(1,3 )) //Roll out 1 or 2 
                {

                    case 1:
                        var List2501 = new List<int>()
                    {
                        10,10,5
                    };
                        return List2501;

                    case 2:
                        var List2502 = new List<int>()
                        {
                           9,8,8
                        };
                        return List2502;
                }

             default:

                 Debug.Log("Input must be 17 / 21 / 25");
                break;
        }
    }

我现在只介绍了25个单位宽度的购物中心的布局。但是Unity控制台一直说“不是所有的代码路径都会返回一个值”。这对我来说很困惑,任何帮助都将非常感激。谢谢!
任何建议都可以

wztqucjr

wztqucjr1#

在C#中,switch中的case必须返回某些内容或至少返回break。
让我减少您的交换机,看看问题出在哪里:

switch {
  case:
    switch {
      case: return;
      case: return;
    }
  default:
    break;
}

如果其他case都不满足,外部switch中的第一个case就不会返回任何内容。由于C#不允许在case之间有代码时出现“fall through”,因此必须在末尾添加return或break。
在这种情况下,您可能只需在内部开关之后添加一个简单的break;即可:

switch (StoreBlockLength)
{
    case 25:
        switch (Random.Range(1,3 )) //Roll out 1 or 2 
        {
            // Stuff happens here
        }
        break;

    default:
        Debug.Log("Input must be 17 / 21 / 25");
        break;
}

另外,仅仅在末尾使用break,会使方法没有返回任何内容,正如Obscure021所说,必须在方法末尾添加一个简单的return,如return null;

mqkwyuun

mqkwyuun2#

编译器不知道Random.Range(1,3)只返回1或2,所以它关心的是返回任何其他值时会发生什么,然后case 25:将陷入下一种情况,这是被禁止的。
当您将case 2:更改为default:时,编译器知道每个值都已处理,并且“case 25”永远不会福尔斯下一个case。
在最后的default中,返回 something(比如null):这个方法需要一个返回值,所以每一个可能的代码路径(甚至是你知道永远不会出现的路径)都必须返回一个值(或者抛出一个异常)。

相关问题