Lee*_*som 3 .net covariance c#-5.0
我如何更改以下代码以使其编译?(除铸造/更改strings到List<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)
由于编译器错误指示,您无法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)
进一步阅读