编译器错误:无法从&#39; List <string>&#39;转换to&#39; IList <object>&#39; </object> </string>

时间:2014-06-23 21:47:50

标签: .net covariance c#-5.0

如何更改以下代码以使其编译? (除了转换/更改stringsList<object>)。

Action<IList<object>> DoSomething = (list) => { /*list is never modified*/ };
var strings = new List<string>() { "one", "two" };
DoSomething(strings);

2 个答案:

答案 0 :(得分:6)

正如编译器错误所示,您无法将IList<string>投射到IList<object>。这是因为IList<T>接口相对于T 不变。想象一下,如果你做了这样的事情:

Action<IList<object>> DoSomething = (list) => list.Add(1);

这适用于IList<object>但不适用于IList<string>

只要您不尝试修改集合,一个简单的解决方案就是将IList<T>更改为IEnumerable<T>,这是协变 T

Action<IEnumerable<object>> DoSomething = (list) => { };
var strings = new List<string>() { "one", "two" };
DoSomething(strings);

进一步阅读

答案 1 :(得分:2)

您必须创建一个新列表:

DoSomething(strings.OfType<object>().ToList());

或者,如果可以,请使用Action<IEnumerable<object>>