0

リストの一般的な実装を作成しようとしています。私のクラスは次のようになります。

public class SpecialList <T>
{ 
    private List <T> mylist;

    public void SpecialList <T>() 
    { 
        mylist = new List <T>()
    }
}

このコードは b/c をコンパイルしません。「タイプ ....List を ...List ... に暗黙的に変換できません」何が欠けていますか?

4

5 に答える 5

8

この行には2つの問題があります。

public void SpecialList <T>() 

まず、コンストラクターにしたいのではないかと思われるときに、return型のメソッドを宣言しています。void

第二に、これはジェネリックメソッドTです。既存の型パラメーターとは関係のない新しい型パラメーターを導入します。そのため、変換は機能しません。それが次のように書かれたと想像してください:

public void MyGenericMethod<TOther>()
{
    List<T> x = new List<TOther>();
}

...それなら明らかに間違っているでしょうね

次のようなコンストラクタが必要です。

public SpecialList()
{
    ...
}

(補足として、通常、typeパラメーターは、これまでのようにスペースで宣言から分離されていません。通常List<T>List <T>、たとえばではありません。他のほとんどの人が使用する規則に一致するように習慣を変更する価値があるかもしれません。 。)

于 2013-03-17T09:21:30.023 に答える
4

あなたのクラスは

public class SpecialList <T>
{ 
    private List <T> mylist;

    public SpecialList() 
    { 
        mylist = new List <T>();
    }
}

もちろん、クラスがコレクションのように見える場合は、1 つ以上のコレクション インターフェイスを実装することをお勧めします。

public class SpecialList <T> : ICollection<T>
{ 
    private List <T> mylist;

    public SpecialList() 
    { 
        mylist = new List <T>();
    }

    // ICollection<T>.Add
    public void Add(T item)
    {
        // delegate to myList
        myList.Add(item);
    }

    ... /Clear/Contains/CopyTo/ etc
}
于 2013-03-17T09:18:58.693 に答える
2

問題は、次のように定義できない構造ですvoid SpecialList<T>()

public class SpecialList<T> {
    private List<T> mylist;

    public SpecialList( ) {
        mylist = new List<T>( );
    }
}
于 2013-03-17T09:19:07.560 に答える
1

これは、ジェネリックパラメーターを使用してコンストラクターを定義できないためです。あなたができることは、単に一般的な特定のコードを削除することです。

public class SpecialList <T>
{ 
    private List <T> mylist;

    public SpecialList() 
    { 
        mylist = new List <T>();
    }
}
于 2013-03-17T09:21:22.563 に答える
1

コンストラクターにそのTは必要ありません。

これにより、コンパイラは、クラスで使用されるT以外の型であると見なします。

そのため、 ListTはクラスから)からListTはコンストラクターから)に変換できないと表示されます。

于 2013-03-17T09:22:18.893 に答える