c# - 将通用列表形式 DerivedClass 转换为 BaseClass

标签 c#

我有这两个类

public class A {}
public class B : A {}

并且从 A 类到 B 类的转换工作正常。

B testB1 = new B();
A testA1 = testB1;
B testB2 = (B)testA1; //this works

但是:为什么这个转换不起作用?

List<B> testB1List = new List<B>();
List<A> testA1List = ((IEnumerable<A>)testB1List).ToList();
List<B> testB2List = ((IEnumerable<B>)testA1List).ToList(); //not working

解决方法是:

List<B> testB1List = new List<B>();
List<A> testA1List = ((IEnumerable<A>)testB1List).ToList();
List<B> testB2List = testA1List.Cast<B>().ToList();

但为什么会这样呢?

最佳答案

好吧,Cast 扩展方法将列表的每个成员转换为指定的类型,因此在您的示例中,它可以被分配为 List<B>因为所有列表成员都已转换为 B。

但在第一个示例中,您正在转换 IEnumerable 本身,而不是列表的成员:

(IEnumerable<B>)testA1List

所以它失败了,因为它试图转换 List<A>IEnumerable<B> .

关于c# - 将通用列表形式 DerivedClass 转换为 BaseClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60915572/

相关文章:

c# - 接口(interface)实现错误

c# - 在 Linux 上为目录中的文件编写事件监听器

c# - 鼠标位置如何转换为滚动控件?

c# - 是否可以定义类对隐式转换尝试的响应?

c# - Entity Framework Core 在 sleep 状态下留下许多连接

c# - 如何简化 Silverlight 4 中的 WCF 调用

c# - 阻止 System.Net.IPAddress 类中的混合 IPv6 格式

c# - NUnit 2.5.6 + PartCover 2.0/4.0 = 我的类(class)未显示

c# - 如果可能存在空值,如何在 mongodb 中使用 orderby?

c# - 为什么在将 string.Join 与 List<string> 一起使用时使用 ToArray()?