我正在尝试使用泛型编写简单的C#函数。例如,数组解析器。
public static int parse_array <T> ( string str, ref T[] array )
where T : IConvertible<T>
{
string[] vals=str.Split(new char[]{'','\t',',',';'}, StringSplitOptions.RemoveEmptyEntries);
if( vals==null || vals.Length==0 )
return 0;
array = new T[vals.Length];
for( int i=0; i<vals.Length; i++ )
{
array[i] = Convert.ChangeType ( vals[i], T );
}
return vals.Length;
}
但是我收到错误:非泛型类型'System.IConvertable'不能与type参数一起使用。 怎么了?
答案 0 :(得分:5)
您的特定编译器错误的问题是IConvertible
不是通用接口,您的子句应该是:
where T : IConvertible
不
where T : IConvertible<T>
实际上,编译器错误告诉您正在尝试将类型参数(即<T>
)放在非泛型类型(即接口IConvertible
)上。虽然某些接口是通用的或具有通用并行接口,但IConvertible
不是其中之一。
然后,您还需要在typeof(T)
的通话中使用T
代替ChangeType
,因为T
是类型名称,而不是克里斯提到的Type
的实例......
答案 1 :(得分:2)
我看到这已经得到了解答,我猜我有点慢。但我添加了一个更简单的阵列转换实现。
public static int parse_array<T>(string str, ref T[] array) where T : IConvertible
{
string[] vals = str.Split(new char[] { '\t', ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
if (vals == null || vals.Length == 0)
return 0;
array = Array.ConvertAll<string, T>(vals, (o) => (T)Convert.ChangeType(o, typeof(T)));
return vals.Length;
}