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项目,我想有很多方法可以实现多线程。