gpt4 book ai didi

c# - 为什么 C# 空条件运算符不适用于 Unity 可序列化变量?

转载 作者:行者123 更新时间:2023-12-03 15:54:31 32 4
gpt4 key购买 nike

我注意到,如果我有一些变量暴露给 Unity 检查器,例如:

[SerializeField] GameObject _tickIcon;
如果我让它们未分配并尝试使用 null 条件运算符并在该对象上调用方法,我会收到一个异常,说明未分配变量。所以基本上不是这样做:
_tickIcon?.SetActive(false);
这迫使我这样做:
if(_tickIcon != null)
{
_tickIcon.SetActive(false)
}
所以我猜这一定是特定于 Unity 运行时的东西,它不是真正的 null,但我可以检查 null 并且它可以工作。我真的不明白这一点。

最佳答案

它通常不适用于从 UnityEngine.Object 继承的任何内容。 !
由于他们在内部实现 == 的方式,它被绕过了。/!=方法不同。见 Custom == operator, should we keep it?
ReSharper 在 Possible unintended bypass of lifetime check of underlying Unity engine object 中很好地解释了它Object在某些情况下不是真的null但仍然保留一些元数据。
例如。后

Destroy(_tickIcon);
_tickIcon.SetActive(false);
你会注意到你没有得到一个正常的 NullReferenceException如果它实际上是 null 就会是这种情况而是得到一个 Unity 海关 MissingReferenceException告诉您引发异常的可能原因。

作为解决方案 UnityEngine.Object有隐含的 bool operator

Does the object exist?


给出的例子实际上并不是真的 - 见上文
您应该始终检查是否存在源自 UnityEngine.Object 的任何内容。像这样:
if(_tickIcon)
{
_tickIcon.SetActive(false);
}

关于c# - 为什么 C# 空条件运算符不适用于 Unity 可序列化变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62678228/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com