C# If语句与比较中的enum始终为true
我有个问题。我正在制作一个实用程序来制作程序生成的贴图。 我有一个房间游泳池,每个房间都放在一张桌子上。我有一种方法可以将所有在桌子上行走的房间连接起来,并将相邻的房间连接起来 我有一个C# If语句与比较中的enum始终为true,c#,if-statement,enums,C#,If Statement,Enums,我有个问题。我正在制作一个实用程序来制作程序生成的贴图。 我有一个房间游泳池,每个房间都放在一张桌子上。我有一种方法可以将所有在桌子上行走的房间连接起来,并将相邻的房间连接起来 我有一个枚举,其中包含房间类型: public enum RoomType { Default = 0, Building, Boss, Item, Standard, Start, } 在连接方法中,我检查邻居,看看它是什么类型的房间: if (neighbourhoo
枚举
,其中包含房间类型:
public enum RoomType
{
Default = 0,
Building,
Boss,
Item,
Standard,
Start,
}
在连接方法中,我检查邻居,看看它是什么类型的房间:
if (neighbourhood[2, 1] != null)
{
if (firstLevel.isOn)
{
if (neighbourhood[2,1].TypeOfRoom == RoomType.Start)
{
roomGrid[x, y].AddConnection(neighbourhood[2, 1], Location.RIGHT)
}
}
else if (neighbourhood[2,1].TypeOfRoom != RoomType.Boss)
roomGrid[x, y].AddConnection(neighbourhood[2, 1], Location.RIGHT);
}
但是当我检查房间类型是否为Start
,它总是true
,并且添加了连接
我不知道为什么会这样
在这里,我设置了房间的类型:
您在屏幕截图中显示的内容和描述的内容听起来是不可能的。发生这种情况时,通常是因为应用程序是多线程的。在一条线上是不可能的。但当它执行时,另一个线程正在修改值 同时,您也可能无意中将对同一对象的引用传递给多个函数
但一定要检查任何涉及线程、任务或并行函数调用的内容。或者,如果这是在web环境中运行的,请查看是否有多个请求正在访问共享数据。问题很可能是由于竞争条件造成的。您可以通过以下方式轻松检查是否存在这种情况:
if (neighbourhood[2, 1] != null)
{
if (firstLevel.isOn)
{
var typeOfRoom = neighbourhood[2,1].TypeOfRoom; //store type in a local variable
if (typeOfRoom == RoomType.Start) //check against local copy
{
roomGrid[x, y].AddConnection(neighbourhood[2, 1], Location.RIGHT)
}
}
...
}
现在您将看到,if
条件工作得非常好,但是邻域[2,1]。TypeOfRoom
将不等于TypeOfRoom
,这意味着它正在另一个线程中修改
如果您不知道其他线程如何或在何处修改您的对象,那么您就有更大的问题需要解决,因为您似乎不了解所使用的代码或框架
如果或者当您确实理解为什么以及何时发生这种情况时,您将需要实现一些同步机制,或者(最好)转向不可变的实现。您是否尝试过调试?查看设置的值,看看代码是否达到了预期的效果。唯一的解释是,在比较之后,
TypeOfRoom
发生了变化。您需要发布更多代码。向我们展示你的房间
类,特别是你的房间类型
getter和setter(我假设它是一个属性)。@GuyMontag:当vs没有意义时,这是我做的第一件事(我更愿意相信它是计算机,而不是我:D)。这次我已经重新启动了电脑。仍然这样做你的问题很可能是由于比赛条件。某些内容正在更改另一个线程上的值。在TypeOfRoom
setter中实现一些日志逻辑,识别当前线程。你可能会发现一些意想不到的结果;不止一个线程正在搅乱您的房间
。因为这是一个Unity项目,我想有很多方法可以实现多线程。