如果我有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支持,并允许进行此类转换.
最简单和更短的方法是:
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)
以上两个示例代码是相同的,您可以使用您想要的每一个......