使用枚举进行比较时,if语句总是为真

5

我有一个问题。我正在制作一个用于生成过程地图的实用工具。我有一个房间池,每个房间都放置在房间表中。我有一种方法来连接所有房间,这种方法可以在表中行走并连接相邻的房间。

我有一个枚举包含了房间的类型:

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,并且连接已经添加。

img img2

我不知道这是为什么。

我在哪里设置了TypeOfRoom: img3


是的,我尝试进行调试(请参见屏幕截图) TypeOfRoom是房间对象的一个参数,它是RoomType类型的。 - soupola
@TimSchmelter:我使用Unity提供的2015版本,没有其他断点。 - soupola
1
你需要发布更多的代码。展示你的Room类,特别是你的TypeOfRoom getter和setter(我假设它是一个属性)。 - InBetween
1
@GuyMontag:当VS不合理时,这是我做的第一件事(我更愿意相信是电脑的问题,而不是我的问题:D)。 这次我已经重新启动了电脑以确保。仍在进行中。 - soupola
1
你的问题很可能是由于竞态条件引起的。某些东西正在另一个线程上改变值。在你的 TypeOfRoom setter 中实现一些日志逻辑,识别当前线程。你可能会发现一些意外的结果;超过一个线程正在干扰你的 room - InBetween
显示剩余22条评论
2个回答

4

问题很可能是由于竞态条件引起的。您可以按照以下方式轻松检查是否为此情况:

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条件可以正常工作,但是neighbourhood[2,1].TypeOfRoom不等于typeOfRoom,这意味着它正在另一个线程中被修改。
如果你不知道你的对象如何或在哪里被其他线程修改,那么你需要解决更大的问题,因为你似乎不理解你正在使用的代码或框架。
如果你理解了为什么和何时会发生这种情况,你将需要实现一些同步机制或转向(最好是)不可变的实现。

3
您所展示的截图和描述听起来似乎是不可能的。当发生这种情况时,通常是因为应用程序是多线程的。这在一个线程中是不可能的。但是在执行另一个线程时,该值被修改了。
与此同时,您可能还无意中将对同一对象的引用传递给多个函数。
但是一定要检查涉及线程、任务或并行函数调用的任何内容。或者如果这是在Web环境中运行,请查看是否有多个请求访问共享数据。

由于这是一个Unity项目,我想有很多方法可以进行多线程处理。 - Tim Pohlmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接