如何更改以下代码以使其编译? (除了转换/更改strings
到List<object>
)。
Action<IList<object>> DoSomething = (list) => { /*list is never modified*/ };
var strings = new List<string>() { "one", "two" };
DoSomething(strings);
答案 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>>
。