无法转换为通用数组

时间:2016-12-02 11:16:07

标签: c# arrays generics casting

您好我有以下扩展方法

    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[],但是当我分别投射每个元素时,它就起作用了(第一个例子)。那是为什么?

2 个答案:

答案 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的数组,这是无效的。