为何GetComponent<Camera>可存入Behaviour数组但TryGetComponent传数组元素作为out参数失败
问题原因解析
首先修正你代码中的输入笔误:两处_BehaviourArray的声明都应该是数组类型Behaviour[],漏写方括号属于手误,修正后我们再看两种写法的本质差异。
1. 第一种写法正常运行的原因
普通赋值操作支持面向对象的协变规则:Camera类继承自Behaviour类,所以GetComponent<Camera>()返回的Camera类型实例,可以直接赋值给Behaviour类型的数组元素,语法完全合法,运行不会有问题。
2. 第二种写法无法工作的核心原因
TryGetComponent<T>(out T component)方法的out参数要求传入的变量类型必须和泛型参数T完全匹配,C#的out参数不支持协变转换:
你调用的是TryGetComponent<Camera>(),要求out关键字后必须接Camera类型的可写变量,而你传入的BehaviourArray[0]是Behaviour类型,类型不匹配,编译阶段就会抛出错误,自然无法正常运行。
兼容写法参考
如果要使用TryGetComponent给Behaviour数组赋值,可以先声明对应类型的临时变量接收输出,再赋值给数组元素:
Behaviour[] _BehaviourArray = new Behaviour[1]; if (TryGetComponent<Camera>(out Camera tempCam)) { _BehaviourArray[0] = tempCam; }
内容的提问来源于stack exchange,提问作者Koromire
相关产品推荐
相关产品推荐

