您不能直接将它们相互转换。考虑以下情况:
public class Base
{
}
public class Item: Base
{
}
public class EvilItem: Base
{
}
所以让我们尝试从List<Item>
to 转换List<Base>
:
List<Item> a = new List<Item>();
List<Base> b = (List<Base>)a;
b.Add(new EvilItem());
我们有一个问题。因为List<T>
是引用类型,所以a
和b
现在都是对同一个列表的引用。我们只是在 a 中添加了EvilItem
一个List<Item>
- 一些不应该被允许的东西。但这条线b.Add(new EvilItem());
是完全合法的,因为b
是List<Base>
.
这也反过来。如果您创建 aList<Base>
那么您不能将其转换为 a List<Item>
,因为其中的某些项目可能是EvilItem
. 或者他们可能会在以后添加。
所以.NET 禁止这样的转换。
你有几个选择。首先,您可以创建列表的副本:
b = new List<Base>(a);
现在a
和b
是两个完全不同的列表,它们恰好具有相同的内容。请记住,更改一个列表不会更改另一个列表。
或者,如果您不需要修改列表,则可以将其用作可枚举:
IEnumerable<Base> c = a;
为什么这行得通是一个更长的故事,但为了简化它 -IEnumerable
只允许你阅读列表,所以你不能做像添加EvilItem
到它的坏事。因此是允许的。
至于为什么requestList1 = form.item.Cast<Item>()
不起作用 -Cast<T>()
产生 a IEnumerable<T>
,而不是 a List<T>
,所以你不能分配它。您可以将其更改为requestList1 = form.item.Cast<Base>().ToList()
,这将起作用 - 但它也会复制列表。实际上,这是另一种方法,虽然写起来有点长,而且我也怀疑它的效率有点低(但我没有证据)