例子:
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 而不会引入任何向后不兼容。
--- 第二次编辑 ----
让我改一下问题。假设我在上面的代码中以相同的方式定义了 MyList。 分配 List<string>
的最简单方法是什么?到我的列表。
我知道
foreach(var item in list)
mylist.Add(item)
总是工作。只是在寻找更优雅的东西。
最佳答案
How can I fix this?
改变你的设计。你不能沮丧 - a MyList
是 List<string>
但反之则不然。您可以通过重新使用 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
}
The purpose is to convert all
List
toMyList
in the code without introducing any backward incompatibility.
同样,你不能。 List
不是 MyList
.您能做的最好的事情就是转换 List 为MyList
通过使用复制构造函数或其他一些方法。
What's the easiest way to assign a
List<string>
toMyList
.
你不能。 List<string>
不一定 MyList
.以与 Cat
相同的方式不是 Tiger
.可能是,但您不能只是类型转换 is 并将其视为它。
请注意,如果您创建列表为 MyList
(例如 List<T> newList = new MyList()
)然后你可以安全地转换它。事实上,您可以在其他任何地方使用它,就好像它是一个 List<string>
(因为它是!)但是你不能安全地转换任意 List<string>
到 MyList
.期间。
关于c# - 从 List<T> 继承的类型不能分配给 List<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18004950/