??AddComponent失败

Q:为什么通过??运算符给物体添加组件添加不上?

public class PlayerMoveTest : MonoBehaviour
{
    CharacterController controller;
     private void Awake()
        {
        controller = transform.GetComponent() ?? gameObject.AddComponent();
    }
}    

public class PlayerMoveTest : MonoBehaviour
{
    CharacterController controller;
     private void Awake()
        {
        controller = transform.GetComponent();
        if (controller == null)
            {
                    controller = gameObject.AddComponent();
            }
    }
}        

如上面的代码,第一段是不行的,controller 显示为null,而第二段是可以添加上组件的,请问这是为什么?
对于??运算符,难道不是??前面的为null,就会执行??后面的表达式吗?

再写段代码测试下:

     var c1 = (object)base.transform.GetComponent();
     if(c1 == null)
         Debug.Log(1);
     var c2 = (Object)base.transform.GetComponent();
     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类型。

你可能感兴趣的:(??AddComponent失败)