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)
总是工作.只是寻找更优雅的东西.
我怎样才能解决这个问题?
改变你的设计.你不能垂头丧气-一个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)
其目的是将所有转换
List到MyList代码中不会引入任何不兼容落后.
再说一遍,你做不到.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.期.