如果我有objectA实现ISomeInterface
为什么我不能这样做:
List<objectA> list = (some list of objectAs . . .)
List<ISomeInterface> interfaceList = new List<ISomeInterface>(list);
为什么我不能将列表放入interfaceList构造函数中?有没有解决方法?
答案 0 :(得分:23)
在C#3.0 + .Net 3.5及更高版本中,您可以通过执行以下操作来解决此问题
List<ISomeInterface> interfaceList = new List<ISomeInterface>(list.Cast<ISomeInterface>());
这不起作用的原因是在这种情况下List<ISomeInterface>
的构造函数需要IEnumerable<ISomeInterface>
。列表变量的类型只能转换为IEnumerable<objectA>
。即使objectA
可以转换为ISomeInterface
,但IEnumerable<objectA>
类型也无法转换为IEnumerable<ISomeInterface>
。
这在C#4.0中有所改变,它为语言添加了Co和Contravariance支持,并允许进行此类转换。
答案 1 :(得分:3)
最简单&amp;更简短的方法是:
var interfaceList = list.Cast<ISomeInterface>().ToList()
OR
List<ISomeInterface> interfaceList = list.Cast<ISomeInterface>().ToList()
以上两个示例代码相同,您可以使用您想要的每个代码...
答案 2 :(得分:1)
这是在C#4.0中处理的,你不能直接在C#3.5中这样做。你可以从这个列表中创建一个新的列表,然后使用扩展运算符或foreach干净地执行它,虽然比通过协方差逆向提供的类型转换慢(总是得到这些错误)在C#4中。