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