将对象列表转换为接口列表

leo*_*ora 11 .net c# .net-3.5

如果我有objectA实现ISomeInterface

为什么我不能这样做:

List<objectA> list = (some list of objectAs . . .)

List<ISomeInterface> interfaceList = new List<ISomeInterface>(list);
Run Code Online (Sandbox Code Playgroud)

为什么我不能把列表插入到interfaceList构造函数中?有没有解决方法?

Jar*_*Par 23

在C#3.0 + .Net 3.5及更高版本中,您可以通过执行以下操作来解决此问题

List<ISomeInterface> interfaceList = new List<ISomeInterface>(list.Cast<ISomeInterface>());
Run Code Online (Sandbox Code Playgroud)

这不起作用的原因是List<ISomeInterface>在这种情况下构造函数需要一个IEnumerable<ISomeInterface>.列表变量的类型只能转换为IEnumerable<objectA>.即使objectA可以转换为不可兑换ISomeInterface的类型. IEnumerable<objectA>IEnumerable<ISomeInterface>

这在C#4.0中发生了变化,它为语言添加了Co和Contravariance支持,并允许进行此类转换.


RAM*_*RAM 8

最简单和更短的方法是:

var interfaceList = list.Cast<ISomeInterface>().ToList()
Run Code Online (Sandbox Code Playgroud)

或者

List<ISomeInterface> interfaceList = list.Cast<ISomeInterface>().ToList()
Run Code Online (Sandbox Code Playgroud)

以上两个示例代码是相同的,您可以使用您想要的每一个......