将 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?
Unity 会覆盖 Unity 对象的
==
运算符,以便在对象实际上不为 null 的情况下(例如,如果它已被销毁),使它们等于 null。运算符不是多态的;如果将对象转换为 Object
然后将其与 ==
进行比较,它将使用 Object
的 ==
运算符,而不是来自继承类的某些“覆盖”。
如果使用
Equals
进行比较,无论有没有强制转换,它都应该产生相同的结果。
如果您只想检查真正的空引用,请使用
ReferenceEquals
。
一般参见Unity自定义==运算符
=> 有点复杂。
我希望你的通用
==
发生在 c# System.Object
级别,而 UnityEngine.Object ==
是指向底层 c++
引擎的指针,这些实例实际上是在其中存在和维护的。
参见源代码
public static bool operator==(Object x, Object y) { return CompareBaseObjects(x, y); }