首页 > 解决方案 > "var g = myComponent?.gameObject" 给出错误,但 "var g = myComponent == null ? null : myComponent.gameObject" 没有

问题描述

正如标题所说,我有一个局部变量,我们可以称之为myComponentMonobehaviour 的一种。好吧,它确实是,myOtherComponent.myComponent但之后从未改变,所以我看不出它会如何改变任何东西,特别是因为以下是我对我的代码所做的唯一改变:myOtherComponentStart()

var g = myComponent?.gameObject;
if(g != null) {  /* sometimes does: */  Destroy(myComponent); }
else {  /* sometimes does: */  myComponent = Instantiate(); }

“MissingReferenceException:'BlockPreview' 类型的对象已被破坏,但您仍在尝试访问它。您的脚本应该检查它是否为空,或者您不应该破坏该对象。[然后有一个直接指向该var g行的链接。 ]"

但是当我将该代码更改为:

var g = myComponent == null ? null : myComponent.gameObject;
if(g != null) {  /* sometimes does: */  Destroy(myComponent); }
else {  /* sometimes does: */  myComponent = Instantiate(); }

没有错误。它工作得很好。

但据我所知(并且只是用谷歌搜索),thenmyComponent?.gameObject只是myComponent == null ? null : myComponent.gameObject.

我知道我可以写得更好,例如将变量myOtherComponent从一个MyComponent类型替换为一个GameObject类型,但我想知道为什么会发生这种情况以避免将来发生这种情况。虽然,它几乎看起来像 Unity 中的一个错误,但我不知道。

标签: c#unity3d

解决方案


官方 Unity 支持响应

UnityEngine.Object 及其继承者不支持空条件运算符。文档已更新以反映这一点

https://issuetracker.unity3d.com/issues/c-number-6-null-conditional-access-operator-dot-throws-missingcomponentexception-instead-of-recognizing-as-null


推荐阅读