2

例:

        public class ListInheritanceTest
        {
            public void Test1()
            {
                List<string> list = new List<string>();
                MyList myList = list;
            }
        }
        public class MyList : List<string>
        {
        }

しかし、MyList myList = list「型 'System.Collections.Generic.List' を 'ConsoleTest.MyList' に暗黙的に変換できません」というエラーがあります。

どうすればこれを修正できますか? ありがとう。

----編集----
エラーが発生する理由は尋ねていません。割り当てを機能させるための回避策を知りたいです。上記のコードは単純化された例です。目的はList<SomeType>、後方非互換性を導入することなく、コード内のすべてを MyList に変換することです。

--- 2回目の編集 ----

質問を言い換えさせてください。上記のコードで MyList を同じ方法で定義したとします。を MyListに割り当てる最も簡単な方法は何ですか。List<string>

そんなこと知ってる

            foreach(var item in list)  
            mylist.Add(item)  

常に動作します。よりエレガントなものを探しているだけです。

4

4 に答える 4

6

どうすればこれを修正できますか?

デザインを変更します。ダウンキャストはできません - aMyList aですList<string>が、その逆はありません。any ( を含む)List<T>を受け入れるコピー コンストラクターを再利用することで、項目を新しいリストにコピーできます。IEnumerable<T>List<string>

public class ListInheritanceTest
{
    public void Test1()
    {
        List<string> list = new List<string>();
        MyList myList = new MyList(list);  // copy the items in the list
    }
}
public class MyList : List<string>
{
   public MyList(IEnumerable<string> list) : base(list) {}  // reuse the List<T> copy constructor
}

目的は、後方非互換性を導入することなく、コード内ですべてListを変換することです。MyList

繰り返しますが、できません。AListは ではありませんMyList。最善の方法は、コピー コンストラクターまたはその他の方法を使用して List を に変換することです。MyList

List<string>をに割り当てる最も簡単な方法は何ですかMyList

できません。AList<string> は必ずしもaではありませんMyListCata が aではないのと同じようにTiger。そうかもしれませんが、単にis をキャストして、あたかもそうであるかのように扱うことはできません。

List を(eg )として作成した場合は、安全にキャストできることに注意してください。実際、あたかもそれが であるかのように他の場所で使用することができます(そうであるためです!)。しかし、任意のをに安全にキャストすることはできません。限目。MyListList<T> newList = new MyList()List<string>List<string>MyList

于 2013-08-01T21:37:51.033 に答える
4

これはできません。検討:

public class MyList : List<string>
{
    public string DoSomething()
    {
        return "Something";
    }
}

//...

List<string> l = new List<string>();
((MyList)l).DoSomething(); // ERROR - List<string> does not define DoSomething()!
于 2013-08-01T21:34:18.873 に答える
1

これで問題が解決し、リストのキング(string、int、.....)を追加できるようになると思います:

    public class ListInheritanceTest
    {
        public void Test1()
        {
            List<string> list = new List<string>() { "1", "2", "3", "4", "5" };

            MyList<string> myList = new MyList<string>();
            myList.AddRange(list);

            foreach (var item in myList)
            {
                Console.WriteLine(item);
            }
        }
    }
    public class MyList<T> : List<T>
    {
    }

別の方法として、MyList は List から派生しているため (上記の例の方が優れているため、これは特定の状況に適用されます):

    public class ListInheritanceTest
    {
        public void Test1()
        {
            List<string> list = new MyList<string> { "1", "2", "3", "4", "5" };

            MyList<string> myList = (MyList<string>) list;


            foreach (var item in myList)
            {
                Console.WriteLine(item);
            }
        }
    }
    public class MyList<T> : List<T>
    {
    }
于 2013-08-01T21:54:58.440 に答える