否则不应达到的声明



我在编写一个新的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,它已经修复了,但背后的原因仍然很有趣。

问题是在每个if条件下都调用GetRoadDirection方法。由于该方法每次都返回一个随机值,因此任何条件为真的概率只有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);
}

相关内容

  • 没有找到相关文章

最新更新