C# C语言中的继承与容器#

C# C语言中的继承与容器#,c#,inheritance,containers,upcasting,C#,Inheritance,Containers,Upcasting,我在这里的C#工作, 假设我有: class A {} class B : A {} List<B> myList; A类 {} B类:A {} 列出我的清单; 我想,在代码的一部分中,将此myList转换为列表,,但当我尝试转换时,我得到一个错误: List<A> myUpcastedList = (List<A>)myList; //not working List myUpcastedList=(List)myList//不起作用 有可能吗?

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

class A
{}

class B : A
{}

List<B> myList;
A类
{}
B类:A
{}
列出我的清单;
我想,在代码的一部分中,将此myList转换为
列表
,但当我尝试转换时,我得到一个错误:

List<A> myUpcastedList = (List<A>)myList; //not working
List myUpcastedList=(List)myList//不起作用

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

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

using System.Linq;

var myUpcastedList = myList.Cast<A>().ToList();
使用System.Linq;
var myUpcastedList=myList.Cast().ToList();
列表
无法强制转换到
列表

我能够:

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

这是一份名单的复印件。。。不确定这是不是你想要的

你可以用这个问题来回答你

List testme=new List().OfType().ToList();

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

在C#4和C#5中,如果使用
IEnumerable
而不是
List
,则这是合法的,因为无法将海龟放入动物序列中。所以你可以说:

List<B> myList = new List<B>();
IEnumerable<A> myUpcastedList = myList; // legal
List myList=new List();
IEnumerable myUpcastedList=myList;//合法的

为什么需要将其强制转换为基类?你可以不用浇铸就可以使用它。我不认为你想做的是可能的,因为列表或列表不是类型本身,而是类型A和B的容器。我可能弄错了,但我认为你想做的是不可能的。我有一个函数,获取一个列表,一个位置和一个范围,并返回一个新列表,其中包含范围内的每个对象,我希望它是通用的,但我想我只是复制我的代码
Cast
return
IEnumerable
,而不是
List
,所以你可以根据第一个列表创建一个新的列表,而不使用第一个列表?Eric Lippert目前关于Monad的系列也很相关(尽管更高级):我曾经在创建自定义容器时使用过IEnumerable,希望能够“foreach”它。我不明白该怎么办here@Titan:一个“可枚举”是一个项目序列;这就是为什么你可以“foreach”它。如果你想把老虎的名单当作一系列的动物,那是合法的。如果你想把一份老虎名单当作一份动物名单,那是非法的,因为如果它是合法的,那么你可以在动物名单中插入一只海龟,但它实际上是一份老虎名单。由于在
IEnumerable
上没有“插入”方法,我们可以使其合法化。
List<A> testme = new List<B>().OfType<A>().ToList();
List<B> myList = new List<B>();
IEnumerable<A> myUpcastedList = myList; // legal