您好我有以下扩展方法
public static T[] GetComponentsOfType<T>(this GameObject source) where T : MonoBehaviour
{
Component[] matchingComponents = source.GetComponents<Component>().Where(comp => comp is T).ToArray();
T[] castedComponents = new T[matchingComponents.Length];
for (int i = 0; i < matchingComponents.Length; i++)
{
castedComponents[i] = (T) matchingComponents[i];
}
return castedComponents;
}
哪种方法完全正常,但我试图通过一行缩短它
return (T[]) source.GetComponents<Component>().OfType<T>().Cast<Component>().ToArray();
显然这一行无法将Component[]
强制转换为T[]
,但是当我分别投射每个元素时,它就起作用了(第一个例子)。那是为什么?
答案 0 :(得分:2)
您应该只使用OfType<>
。在你的解决方案中,你回到Component
,它不能被强制转换为T [],这就是问题所在。
OfType<>
已经投了它。它就像Where(item => item is T).Cast<T>()
return source.GetComponents<Component>().OfType<T>().ToArray();
答案 1 :(得分:2)
你可以写:
source.GetComponents<Component>().OfType<T>().ToArray();
要在一行中完成。
强制转换失败是因为您正在构建两个不匹配的类型,以及组件的数组和T的数组,这是无效的。