3

我在这里使用 C# 工作,假设我有:

class A
{}

class B : A
{}

List<B> myList;

我想,在部分代码中将此 myList 转换为,List< A>,但是当我尝试时,我得到一个错误:

List<A> myUpcastedList = (List<A>)myList; //not working

有可能吗?如果是,语法是什么?

4

5 回答 5

5

List<B>不能转换为List<A>. 您必须创建新的List<A>并用源commection 中的项目填充它。您可以为此使用 LINQ to Objects:

var aList= bList.Cast<A>().ToList();

您还应该阅读一些关于协变和逆变的内容,例如在Eric Lippert 的博客上

于 2013-03-07T21:31:24.613 回答
3

老虎列表不能用作动物列表,因为您可以将乌龟放入动物列表但不能放入老虎列表。

IEnumerable<T>在 C# 4 和 5 中,如果您使用而不是,这是合法的,List<T>因为没有办法将乌龟放入动物序列中。所以你可以说:

List<B> myList = new List<B>();
IEnumerable<A> myUpcastedList = myList; // legal
于 2013-03-07T21:56:46.147 回答
1

据我所知,这是不可能的。另一种方法是执行以下操作。

using System.Linq;

var myUpcastedList = myList.Cast<A>().ToList();
于 2013-03-07T21:30:56.883 回答
1

我以前可以:

List<A> myUpcastedList = myList.ToList<A>();

虽然这会生成列表的副本...不确定这是您的意图

于 2013-03-07T21:32:31.233 回答
1

你可以使用这个问题也许对你有用

List<A> testme = new List<B>().OfType<A>().ToList();
于 2013-03-07T21:34:10.167 回答