为了账号安全,请及时绑定邮箱和手机立即绑定

将列表<派生类>转换为列表<BaseClass>

将列表<派生类>转换为列表<BaseClass>

白板的微信 2019-06-15 18:02:21
将列表<派生类>转换为列表<BaseClass>虽然我们可以从基类/接口继承,但为什么我们不能声明List<>使用相同的类/接口?interface A{ }class B : A{ }class C : B{ }class Test{     static void Main(string[] args)     {         A a = new C(); // OK         List<A> listOfA = new List<C>(); // compiler Error     }}有绕道吗?
查看完整描述

3 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

完成这项工作的方法是迭代列表并转换元素。这可以使用ConvertAll来完成:

List<A> listOfA = new List<C>().ConvertAll(x => (A)x);

您还可以使用Linq:

List<A> listOfA = new List<C>().Cast<A>().ToList();


查看完整回答
反对 回复 2019-06-15
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

首先,停止使用无法理解的类名,如A,B,C。使用动物,哺乳动物,长颈鹿,或食物,水果,橘子或其他什么关系是明确的。

那么,你的问题是“为什么我不能将长颈鹿的列表分配给动物类型列表的变量,因为我可以将长颈鹿分配给动物类型的变量?”

答案是:假设你可以。那又会有什么问题呢?

你可以把老虎加到动物名单上。假设我们允许你把长颈鹿的列表放在一个包含动物列表的变量中。然后你试着把一只老虎加到这个名单上。会发生什么?你想让长颈鹿的名单上有老虎吗?你想要坠机吗?还是希望编译器首先通过使分配非法来保护您不受崩溃的影响?

我们选择后者。

这种转换被称为“协变”转换。在C#4中,我们将允许您在接口和委托上进行协变转换当已知转换始终是安全的时..有关详细信息,请参阅我关于协方差和反方差的博客文章。(这周的星期一和星期四都会有一个关于这个话题的新话题。)


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 451 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信