1

ジェネリック配列のC#拡張機能を作成したいのですが、常にエラーが発生します。これが私がstring[]の拡張を作成するために使用したコードです。これはうまく機能します:

public static string[] Add(this string[] list, string s, bool checkUnique = false, bool checkNull = true){
    if (checkNull && string.IsNullOrEmpty(s)) return list;
    if (checkUnique && list.IndexOf(s) != -1) return list;

    ArrayList arr = new ArrayList();
    arr.AddRange(list);
    arr.Add(s);

    return (string[])arr.ToArray(typeof(string));
}

私が本当に望んでいるのは、よりジェネリックにすることです。これにより、文字列だけでなく他のタイプでも機能します(したがって、すべての文字列の詳細をジェネリックTに置き換えようとしました):

public static T[] Add(this T[] list, T item, bool checkUnique = false){
    if (checkUnique && list.IndexOf(item) != -1) return list;

    ArrayList arr = new ArrayList();
    arr.AddRange(list);
    arr.Add(item);

    return (T[])arr.ToArray(typeof(T));
}

しかし、コードはコンパイルされません。「エラーCS0246:タイプまたは名前空間名 `T'が見つかりませんでした。usingディレクティブまたはアセンブリ参照がありませんか?」というエラーが発生します。

私はすでに別の解決策を試しました:

public static void AddIfNotExists<T>(this ICollection<T> coll, T item) {
     if (!coll.Contains(item))
         coll.Add(item);
 }

しかし、別のエラーが発生しています。「エラーCS0308:非ジェネリック型の`System.Collections.ICollection'は型引数と一緒に使用できません」

ちなみに、私はUnity C#を使用しています(これは3.5に対してコンパイルされていると思います)。誰かが私を助けることができますか?

4

4 に答える 4

2

System.Collections.Generic名前空間への参照が欠落しているため、最後のメソッドはコンパイルされません。System.Collectionsへの参照のみが含まれているようです。

于 2012-09-21T05:19:48.750 に答える
1

LINQ を使用して、メソッドを少し単純にすることができます。

    public static T[] Add<T>(this T[] list, T item, bool checkUnique = false)
    {
        var tail = new [] { item, };
        var result = checkUnique ? list.Union(tail) : list.Concat(tail);
        return result.ToArray();
    }
于 2012-09-21T05:43:37.737 に答える
0

メソッドのシグネチャを次のように変更できます。

public static T[] Add<T>(this T[] list, T item, bool checkUnique = false)
{}

ただし、 T[] にはジェネリック メソッドlist.IndexOf(item)がないため、コンパイルされません。

于 2012-09-21T05:15:42.623 に答える
0

配列のサイズは固定されているため、文字列配列に対して呼び出していない場合は、最後のコードが機能するはずです。

次の例は、を使用する拡張メソッドで機能しますICollection

List<string> arr = new List<string>();
arr.AddIfNotExists("a");
于 2012-09-21T05:29:49.070 に答える