Q:为什么通过??运算符给物体添加组件添加不上?
public class PlayerMoveTest : MonoBehaviour
{
CharacterController controller;
private void Awake()
{
controller = transform.GetComponent<CharacterController>() ?? gameObject.AddComponent<CharacterController>();
}
}
public class PlayerMoveTest : MonoBehaviour
{
CharacterController controller;
private void Awake()
{
controller = transform.GetComponent<CharacterController>();
if (controller == null)
{
controller = gameObject.AddComponent<CharacterController>();
}
}
}
如上面的代码,第一段是不行的,controller 显示为null,而第二段是可以添加上组件的,请问这是为什么?
对于??运算符,难道不是??前面的为null,就会执行??后面的表达式吗?
再写段代码测试下:
var c1 = (object)base.transform.GetComponent<CharacterController>();
if(c1 == null)
Debug.Log(1);
var c2 = (Object)base.transform.GetComponent<CharacterController>();
if(c2 ==(Object)null)
Debug.Log(2);
if(c2 == null)
Debug.Log(3);
输出结果是2和3。
断点调试下这几个值:
原因是UnityEngine.Object类型重载了==运算符,所以"null"和null认为是相等的,而用System.object类型比较的时候认为是不相等的。
A2:看了一下,发现此"null"非彼null:
其实在contor = transform.GetComponent();执行这句的时候已经赋值了,只不过赋的值是"null",看一下打印的就知道两个null有什么区别了。
可以看出2段代码是不一样的,第一个比较的是UnityEngine.Object类型,第二个比较的是System.object类型。
网友评论