为什么 null Unity Object 在专用类中等于 null,但在泛型类中不等于 null?

问题描述 投票:0回答:2

将 TestMono 附加到空 GameObject,将序列化字段 uov 留空并运行。结果不是我想象的那样。

using System;
using UnityEngine;
using Object = UnityEngine.Object;

namespace TestMisc.Scripts
{
    [Serializable]
    public class Variable<T>
    {
        [SerializeField] T m_Value;

        public T Value => m_Value;

        public void LogInsideGenericClass()
        {
// Result: Inside generic class: equal to null: False    equal to default: True
            Debug.Log($"Inside generic class: equal to null: {Value == null}    equal to default: {Value as Object == default}");
        }
    }

    [Serializable]
    public class UnityObjectVariable : Variable<Object>
    {
        public void LogInsideSpecializedClass()
        {
// Result: Inside specialized class: equal to null: True    equal to default: True
            Debug.Log($"Inside specialized class: equal to null: {Value == null}    equal to default: {Value as Object == default}");
        }
    }
}
using UnityEngine;

namespace TestMisc.Scripts
{
    public class TestMono : MonoBehaviour
    {
        [SerializeField] UnityObjectVariable uov;

        void Start()
        {
            uov.LogInsideGenericClass();
            uov.LogInsideSpecializedClass();
        }
    }
}

为什么 null Unity Object 不等于泛型类中的 null?

c# unity-game-engine object null equals
2个回答
0
投票

Unity 会覆盖 Unity 对象的

==
运算符,以便在对象实际上不为 null 的情况下(例如,如果它已被销毁),使它们等于 null。运算符不是多态的;如果将对象转换为
Object
然后将其与
==
进行比较,它将使用
Object
==
运算符,而不是来自继承类的某些“覆盖”。

如果使用

Equals
进行比较,无论有没有强制转换,它都应该产生相同的结果。

如果您只想检查真正的空引用,请使用

ReferenceEquals


0
投票

一般参见Unity自定义==运算符

=> 有点复杂。

我希望你的通用

==
发生在 c#
System.Object
级别,而
UnityEngine.Object ==
是指向底层
c++
引擎的指针,这些实例实际上是在其中存在和维护的。

参见源代码

public static bool operator==(Object x, Object y) { return CompareBaseObjects(x, y); }
© www.soinside.com 2019 - 2024. All rights reserved.