如果是数组,我想将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 [])'的类型参数。尝试明确指定类型参数。
答案 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
类似object
,Array
或数组实现的接口之一。
你真的想做什么?我怀疑你想找出数组的元素类型,然后用适当的GenericArrayFunction
调用T
- 但这不是相同的 {{1}你需要用反射来调用它,这会有点痛苦。 (不太坏,但不愉快。)
我怀疑您并不完全了解C#/。NET泛型 - 请向我们提供更多有关大局的背景信息,以便我们为您提供更好的帮助。
编辑:反思方法是这样的:
T
请注意,对于矩形阵列来说,这仍然会失败,这会更难以应对。
答案 2 :(得分:2)
这是不可能的。 T
永远不会是T[]
。 T
始终是特定类型,而不仅仅是占位符。如果T
是数组(int[]
),则T[]
将为int[][]
。
修改:有一些例外(例如object
是object[]
),但在一般情况下(那就是泛型)T不能是T []