将接口列表强制转换为实现列表,反之亦然
本文关键字:列表 实现 反之亦然 接口 转换 | 更新日期: 2023-09-27 18:13:29
我只是不知道如何将List<ISomeImplementation>
转换或强制转换为List<SomeImplementation>
。
// lstOfImplemantation is of type `List<SomeImplementation>`
List<ISomeImplementation> lstOfInterfaces = lstOfImplemantation; // how to convert it.
任何帮助都将不胜感激。
您可以通过一种方式使用LINQ:
List<ISomeImplementation> lstOfInterfaces = lstOfImplemantation.Cast<IISomeImplementation>().ToList();
将接口转换为实现并不是一个好的做法。如果该接口还有其他实现呢?不能假设所有的implementation都是类型为SomeImplementation
的。如果确定,请使用List<SomeImplementation>
。
仅仅因为A
源自B
,并不一定意味着X<A>
源自X<B>
。
事实上,List<T>
在其泛型类型参数T
中是不变量。这意味着List<string>
既不是List<object>
的亚型,也不是超型,即使string
源自object
。
想象一下,如果您的接口列表包含类型为SomeOtherImplementation
的实例。演员阵容将如何运作?
相反,您应该创建一个新的列表,并将接口列表中的每个项强制转换为具体类型。
List<SomeImplementation> lstOfImplementation =
lstOfInterfaces.Cast<SomeImplementation>()
.ToList();
如果您不确定是否所有实例都是SomeImplementation
类型,那么可以使用OfType<T>
过滤掉那些不是的实例。
List<SomeImplementation> lstOfImplementation =
lstOfInterfaces.OfType<SomeImplementation>()
.ToList();
另请阅读:
- 协方差与反方差
- 协方差和方差常见问题