C# &引用;var g=myComponent?.gameObject“;给出了一个错误,但是;var g=myComponent==null?null:myComponent.gameObject“;不
正如标题所说,我有一个局部变量,我们可以称之为C# &引用;var g=myComponent?.gameObject“;给出了一个错误,但是;var g=myComponent==null?null:myComponent.gameObject“;不,c#,unity3d,C#,Unity3d,正如标题所说,我有一个局部变量,我们可以称之为myComponent,这是一种单行为。嗯,它实际上是myOtherComponent.myComponent,但是myOtherComponent在Start()之后从未更改过,所以我不知道它如何更改任何内容,特别是因为我对代码的唯一更改是: var g = myComponent?.gameObject; if(g != null) { /* sometimes does: */ Destroy(myComponent); } else {
myComponent
,这是一种单行为。嗯,它实际上是myOtherComponent.myComponent
,但是myOtherComponent
在Start()
之后从未更改过,所以我不知道它如何更改任何内容,特别是因为我对代码的唯一更改是:
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(); }
没有错误。它工作得非常好
但据我所知(只是谷歌搜索),那么myComponent?.gameObject
实际上只是myComponent==null的简写?null:myComponent.gameObject
我知道我可以写得更好,比如将
myOtherComponent
中的变量从MyComponent
类型替换为GameObject
类型,但我想知道为什么会发生这种情况,以避免将来发生这种情况。虽然这看起来像是Unity中的一个bug,但我不知道。官方Unity支持响应
对象及其继承者不支持空条件运算符。
更新文档以反映这一点
Unity的行为与惯用C#不同。我认为这是由Unity如何表示和计算空对象引起的一个怪癖。这是一个很好的发现,但问题在哪里?:)我认为这是一个可能的复制品。相同的问题,不同的操作员,相同的原因。Unity重载
=
,但不能重载??
或?。
,因此它们的行为是不一致的。使用Unity 2019.2.5和VS 2019,我实际上得到了一个警告:“?”在从“Unity.Object”派生的类型上绕过对底层Unity引擎对象的生存期检查。一般来说,对于Unity对象,您根本不应该使用==null
,而应该使用if(g)
因为即使对象看起来是null
Unity实际上也会在相应的引用中存储一些阴影信息,例如,抛出相应的异常,并提示该对象为什么是null
看起来像是重拾器功能。Unity 2018.4.5+VS CE 2017与ResharpServiceSualStudio的相同通知通常从ReSharper获得许多功能,并在新的更新中直接实现这些功能;)可能是他们在2019年加入的