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」をtype引数と一緒に使用することはできません。どうしたの ?

4

2 に答える 2

5

特定のコンパイラエラーの問題はIConvertible、汎用インターフェイスではないことです。句は次のようになります。

where T : IConvertible

いいえ

where T : IConvertible<T>

実際、コンパイラエラーは、型引数(つまり、<T>)を非ジェネリック型(つまり、インターフェイスIConvertible)に配置しようとしていることを示しています。一部のインターフェースは汎用または汎用並列を備えていますがIConvertible、それらの1つではありません。

次に、さらに、への呼び出しではtypeof(T)なく、を使用することをお勧めします。これは、タイプ名であり、Chrisが言及しているようなインスタンスではないためです...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 に答える