从List <T>继承的类型不能与List <T>一起分配

GoC*_*rry 1 c# generics inheritance class

例:

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

MyList myList = list有错误"无法将类型'System.Collections.Generic.List'隐式转换为'ConsoleTest.MyList'"

我怎样才能解决这个问题?谢谢.

----编辑----
我不是在问它为什么会出错.我想知道使分配工作的解决方法是什么.上面的代码只是一个简化的例子.目的是List<SomeType>在我的代码中将all转换为MyList,而不会引入任何向后不兼容.

---第二次编辑----

让我重新解释一下这个问题.假设我在上面的代码中以相同的方式定义了MyList.分配List<string>给MyList 的最简单方法是什么.

我知道

            foreach(var item in list)  
            mylist.Add(item)  
Run Code Online (Sandbox Code Playgroud)

总是工作.只是寻找更优雅的东西.

D S*_*ley 5

我怎样才能解决这个问题?

改变你的设计.你不能垂头丧气-一个MyList 一个List<string>,但不是反之亦然.您可以通过重复使用List<T>接受任何IEnumerable<T>(包括a 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
}
Run Code Online (Sandbox Code Playgroud)

其目的是将所有转换ListMyList代码中不会引入任何不兼容落后.

再说一遍,你做不到.A List不是MyList.您可以做的最好的事情是使用复制构造函数或其他方法 List 转换为a MyList.

分配List<string>到的最简单方法是什么MyList.

不能.A List<string> 不一定MyList.就像a Cat不是a一样Tiger.它可能是,但你不能只是投射并将它视为它.

请注意,如果您将List 创建MyList(例如List<T> newList = new MyList()),则可以安全地进行转换.事实上,你可以在其他任何地方使用它,就好像它是一个List<string>(因为它是!)但是你不能安全地将任意List<string>一个地转换成一个MyList.期.