Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;var g=myComponent?.gameObject“;给出了一个错误,但是;var g=myComponent==null?null:myComponent.gameObject“;不_C#_Unity3d - Fatal编程技术网

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年加入的