当前位置: 首页 > 编程语言 > C#

为什么Unity3dC#中的if语句允许对象不是bool?分享

时间:2023-04-10 14:05:07 C#

为什么Unity3dC#中的if语句允许对象不是bool?在标准.NET4.6编译器中,以下if语句不合法,您将收到编译器错误:CS0029无法将类型“UserQuery.TestClass”隐式转换为“bool”。这一切都很好,我明白这一点。voidMain(){TestClassfoo=newTestClass();if(foo){“哈。谁知道呢?”.Dump();}}publicclassTestClass:Object{}然而,在Unity3d中,这段代码是完全合法的,我见过几个例子甚至鼓励这种Javascript风格的空检查。这是怎么回事,是否可以利用它在.NET中进行非Unity3d工作?下面是Unity3D中的合法代码示例:usingUnityEngine;publicclassSampleIfBehavior:MonoBehaviour{//使用它进行初始化voidStart(){varobj=newSampleIfBehavior();if(obj){Console.Write("它不为空。");}}}情节变厚了!如果我尝试比较不是从单声道行为派生的对象,我会收到预期的编译器警告。公共类TestClass{}voidStart(){varobj2=newTestClass();if(obj2)//castfromTestClasstoboolcompilererror{}}感谢程序员,我一直在深入研究Unity3D的对象(我忽略了它,因为我错误地认为它是一个实际的.NET对象。)奇怪的相关代码(在UnityEngine.Object中):publicstaticimplicitoperatorbool(Objectexists){return!Object.CompareBaseObjects(exists,(Object)null);}publicstaticbooloperator==(Objectx,Objecty){returnObject.CompareBaseObjects(x,y);}publicstaticbooloperator!=(Objectx,Objecty){return!Object.CompareBaseObjects(x,y);不要太担心这个。if(obj)在Unity中是合法的,因为Unity中隐式运算符重载。我相信这是在MonoBehaviour或UnityEngine.Object类中完成的。它看起来像这样:publicstaticimplicitoperatorbool($classname$other){returnother!=null;Unity计划删除此功能,但决定反对它,因为它会破坏所有Unity代码。你可以在这里读更多关于它的内容。此功能非常糟糕的一面是它不能与编辑器中的Null-Coalescing运算符功能一起使用。好处是它简化了空值检查。以上是C#学习教程:为什么Unity3dC#中的if语句允许对象不是bool?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: