簡體   English   中英

布爾 OR 語句返回 FALSE,即使其中一側為 TRUE

[英]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。 證明如下:

可構建 == null

完整的條件似乎有效

該屬性是錯誤的

有任何想法嗎?

布爾值的默認值為 false。 在調試模式下,當一行被突出顯示時,執行還沒有在它上面運行。 因此,該行未執行,該表達式尚未計算。 只需將該 return 語句更改為:

var result = buildable == null || (buildable != null && buildable.BuildingComplete);
return result;

然后在結果行放置一個斷點,並在命中該斷點時檢查結果。

順便說一句,正如@gunr2171 在評論中指出的那樣,該表達式中不需要 buildable buildable != null

謝謝你們的快速回答。 == 運算符在 Unity 中確實被這個特定的運算符覆蓋(我對此無能為力,因為它在庫本身中)。

在此處輸入圖像描述

在此處輸入圖像描述

我重寫了它,所以你可以看到,我知道布爾值的默認值為 false。

在此處輸入圖像描述

正如您在此處看到的,即使 buildable 為 null,它仍然可以被評估並且其中實際上有值。 我唯一不能理解的是左側條件仍然為真(可構建 == 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM