编译器错误:无法从"List <string>"转换为"IList <object>"

Lee*_*som 3 .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);
Run Code Online (Sandbox Code Playgroud)

p.s*_*w.g 6

由于编译器错误指示,您无法IList<string>转换为IList<object>.这是因为该IList<T>接口是不变的关于T.想象一下,如果你做了这样的事情:

Action<IList<object>> DoSomething = (list) => list.Add(1);
Run Code Online (Sandbox Code Playgroud)

这对于a IList<object>而不是有效是有效的IList<string>.

只要您不尝试修改集合,一个简单的解决方案就是更改IList<T>to IEnumerable<T>,这对于以下内容是协变的T:

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

进一步阅读