[英]Boolean OR statement returns FALSE even though one of the sides is TRUE
这是一个专门在 Unity 环境中的 C# 问题(在这里可能相关也可能不相关)。
我在属性中有一个特定条件,如下所示:
public override bool IsFinished
{
get
{
return buildable == null || (buildable != null && buildable.BuildingComplete);
}
}
buildable 变量是一个 IBuildable,在本例中是一个已经通过 GameObject.Destroy 方法销毁的 GameObject。
现在这个条件在这种情况下应该为真,因为游戏对象已被销毁,并且可构建变量已经为空。 但是在 Unity 中,当您销毁游戏对象时,您仍然可以访问该对象的属性,即使buildable == null
比较返回 true。
问题是:即使 buildable 实际上为 null,该属性也会返回 false。 证明如下:
有任何想法吗?
布尔值的默认值为 false。 在调试模式下,当一行被突出显示时,执行还没有在它上面运行。 因此,该行未执行,该表达式尚未计算。 只需将该 return 语句更改为:
var result = buildable == null || (buildable != null && buildable.BuildingComplete);
return result;
然后在结果行放置一个断点,并在命中该断点时检查结果。
顺便说一句,正如@gunr2171 在评论中指出的那样,该表达式中不需要 buildable buildable != null
。
好吧,我刚刚发现一些传说已经发现了。 这是因为 Unity 的运算符重载,所以这是解决方案,我刚刚测试过,它可以工作。 我现在没有使用 buildable == null ,而是使用这种方法,并且效果很好。
/// <summary>
/// Returns true if the object is either a null reference or has been destroyed by unity.
/// This will respect ISPDisposable over all else.
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static bool IsNullOrDestroyed(this System.Object obj)
{
if (object.ReferenceEquals(obj, null)) return true;
if (obj is UnityEngine.Object) return (obj as UnityEngine.Object) == null;
return false;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.