Else 不应该到达的语句

问题描述 投票:0回答:1

我在编写一个新的 Unity 项目时偶然发现了这个问题。我仍在学习有关 C# 的某些内容,但据我了解,应该不可能出现以下错误。如果事实上我错了并且对此有明显的解释,我会很乐意学习它。

重要的代码位如下:

公众宣言

enum

public enum RoadDirection
{
    Up,
    Down,
    Left,
    Right
}

被调用以从

enum
中选择一个随机值的函数:

RoadDirection GetRoadDirection()
{
    int randomDir = Random.Range(0, 4);
    switch (randomDir)
    {
        case 0:
            return RoadDirection.Up;
        case 1:
            return RoadDirection.Down;
        case 2:
            return RoadDirection.Right;
        case 3:
            return RoadDirection.Left;
        default:
            return RoadDirection.Up;
    }
}

使用函数的

if
-语句:

if (GetRoadDirection() == RoadDirection.Up)
{
    // does stuff
}
else if (GetRoadDirection() == RoadDirection.Down)
{
    // does stuff
}
else if (GetRoadDirection() == RoadDirection.Left)
{
    // does stuff
}
else if (GetRoadDirection() == RoadDirection.Right)
{
    // does stuff
}
else
{
    // shouldn't even happen but does stuff
}

那些是我脚本中唯一相关/使用该功能的部分。 即使已经涵盖了所有可能性,

else
是否有理由被触发?

如果这是错误发生的地方,我添加了

else
-语句来调试, 有了
else
,它已经修复了,但背后的原因仍然很有趣。

c# unity3d if-statement enums
1个回答
2
投票

问题是你在每一个

GetRoadDirection
条件下调用
if
方法。由于该方法每次都返回一个随机值,因此任何条件都只有 25% 的几率为真。相反,您应该捕获一次值并存储它,然后进行评估:

var direction = GetRoadDirection();

if (direction == RoadDirection.Up)
{
    // does stuff
}
else if (direction == RoadDirection.Down)
{
    // does stuff
}
else if (direction == RoadDirection.Right)
{
    // does stuff
}
else if (direction == RoadDirection.Left)
{
    // does stuff
}
else
{
    // shouldn't ever happen
}

无需显式捕获值即可执行此操作的一种方法是使用

switch
语句(并且
switch
将在内部捕获值):

switch (GetRoadDirection())
{
    case RoadDirection.Up:
        // does stuff
        break;
    case RoadDirection.Down:
        // does stuff
        break;
    case RoadDirection.Right:
        // does stuff
        break;
    case RoadDirection.Left:
        // does stuff
        break;
    default:
        // shouldn't ever happen
        break;
}

作为旁注,您可以将

int
转换为
enum
,因此您的
GetRoadDirection
方法可以简化为:

RoadDirection GetRoadDirection()
{
    return (RoadDirection) Random.Range(0, 4);
}
© www.soinside.com 2019 - 2024. All rights reserved.