C#:将T转换为T []

时间:2010-09-06 17:21:16

标签: c# .net generics casting

如果是数组,我想将T转换为T [。

static T GenericFunction<T>(T t)
{
       if (t == null) return default(T);

       if (t.GetType().IsArray)
       {
            //if object is an array it should be handled
            //by an array method
            return (T) GenericArrayFunction((T[])t); 
       }
       ...
}

static T[] GenericArrayFunction<T>(T[] t)
{
       if (t == null) return default(T);

       for (int i = 0 ; i < t.Length ; i++) 
       {
            //for each element in array carry
            //out Generic Function
            if (t[i].GetType().IsArray())
            {
                 newList[i] = GenericArrayFunction((T[])t[i]); 
            }
            else
            {
                 newList[i] = GenericFunction(t[i]);
            }
       }
       ...
}

错误如果我尝试(T [])t

  

无法将类型'T'转换为'T []'

错误如果我只是尝试传递t

  

无法从用法推断出方法'GenericArrayFunction(T [])'的类型参数。尝试明确指定类型参数。

3 个答案:

答案 0 :(得分:4)

从您的特定示例判断,您是否可以定义两个方法并让编译器在传入数组时选择正确的方法?

using System;

class Program
{
    static T GenericFunction<T>(T t)
    {
        Console.WriteLine("GenericFunction<T>(T)");
        return default(T);
    }

    static T[] GenericFunction<T>(T[] t)
    {
        // Call the non-array function
        for(int i = 0; i < t.Length; ++i)
            t[i] = GenericFunction(t[i]);

        Console.WriteLine("GenericFunction<T>(T[])");
        return new T[4];
    }

    static void Main()
    {
        int[] arr = {1,2,3};
        int i = 42;

        GenericFunction(i);   // Calls non-array version
        GenericFunction(arr); // Calls array version
    }
}

答案 1 :(得分:2)

仅仅因为T是数组类型并不意味着它也是 T的数组。实际上,可能发生的唯一方法是T类似objectArray或数组实现的接口之一。

你真的想做什么?我怀疑你想找出数组的元素类型,然后用适当的GenericArrayFunction调用T - 但这不是相同的 {{1}你需要用反射来调用它,这会有点痛苦。 (不坏,但不愉快。)

怀疑您并不完全了解C#/。NET泛型 - 请向我们提供更多有关大局的背景信息,以便我们为您提供更好的帮助。

编辑:反思方法是这样的:

T

请注意,对于矩形阵列来说,这仍然会失败,这会更难以应对。

答案 2 :(得分:2)

这是不可能的。 T永远不会是T[]T始终是特定类型,而不仅仅是占位符。如果T是数组(int[]),则T[]将为int[][]

修改:有一些例外(例如objectobject[]),但在一般情况下(那就是泛型)T不能是T []