C#中如何基于Dictionary运行委托?解决CS0411编译错误
解决CS0411编译错误的方案
问题原因
你遇到的CS0411错误,核心原因是Dictionary的Select方法遍历的元素是KeyValuePair<SomeObject, SomeParams>类型,而你直接传递的GetMyObject2方法需要两个独立的参数SomeObject和SomeParams,编译器无法自动把KeyValuePair拆解成两个参数匹配你的方法签名,因此抛出类型不匹配的编译错误。
两种修复方案
方案1:用Lambda表达式显式拆解KeyValuePair
在Select中通过lambda把KeyValuePair的Key和Value分别传给GetMyObject2,代码如下:
private readonly Dictionary<SomeObject, SomeParams> m_objectsList2 = new Dictionary<SomeObject, SomeParams>(); public Task<IList<Auto>> Todo2(SomeParams @params) { IEnumerable<Auto> matches = m_objectsList2.Select(kvp => GetMyObject2(kvp.Key, kvp.Value)); return Task.FromResult<IList<Auto>>(matches.ToArray()); } private Auto GetMyObject2(SomeObject s, SomeParams p) { Auto newAuto = new Auto(); // ...你的业务逻辑代码 return newAuto; }
注意:
params是C#关键字,建议改成@params避免语法冲突
方案2:修改GetMyObject2的参数为KeyValuePair
直接把方法参数改为KeyValuePair<SomeObject, SomeParams>,在方法内部取出需要的Key和Value:
private readonly Dictionary<SomeObject, SomeParams> m_objectsList2 = new Dictionary<SomeObject, SomeParams>(); public Task<IList<Auto>> Todo2(SomeParams @params) { IEnumerable<Auto> matches = m_objectsList2.Select(GetMyObject2); return Task.FromResult<IList<Auto>>(matches.ToArray()); } private Auto GetMyObject2(KeyValuePair<SomeObject, SomeParams> kvp) { SomeObject s = kvp.Key; SomeParams p = kvp.Value; Auto newAuto = new Auto(); // ...你的业务逻辑代码 return newAuto; }
内容的提问来源于stack exchange,提问作者4est
相关产品推荐
相关产品推荐

