1

我正在尝试使用泛型编写简单的 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”不能与类型参数一起使用。怎么了 ?

4

2 回答 2

5

您的特定编译器错误的问题在于IConvertible它不是通用接口,您的子句应该是:

where T : IConvertible

不是

where T : IConvertible<T>

实际上,编译器错误告诉您您正在尝试将类型参数(即<T>)放在非泛型类型(即 interface IConvertible)上。虽然某些接口是通用的或具有通用的并行性,IConvertible但不是其中之一。

然后,此外,您将希望在调用中使用typeof(T)而不是,因为它是类型名称,而不是克里斯提到的实例...TChangeTypeTType

于 2012-12-27T22:53:00.377 回答
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;
}
于 2012-12-27T23:11:27.330 回答