C#初始化IEnumerable报错:无法隐式转换类型,如何修复?
如何修复「Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<>' to 'System.Collections.Generic.IEnumerable<KeyValuePair<Guid, String>>'」错误?
这个错误的根源很直白:你通过Select生成的是匿名类型的集合,但变量users被声明为IEnumerable<KeyValuePair<Guid, string>>,两种类型完全不兼容,C#编译器没法帮你自动完成转换。
修复方案
你只需要在Select里明确创建KeyValuePair<Guid, string>实例,替换掉原来的匿名对象即可:
IEnumerable<KeyValuePair<Guid, String>> users; if (Roles.IsUserInRole("Administrator")) { users = _systemUserCommand.LookupUsersInRole(null, query) .Select(s => new KeyValuePair<Guid, string>(s.SystemUserId, $"{s.FirstName} {s.LastName}")); }
如果你的项目使用C# 7.0及以上版本,还可以用更简洁的元组转换写法(不过第一种写法兼容性更好,可读性也更强):
users = _systemUserCommand.LookupUsersInRole(null, query) .Select(s => (s.SystemUserId, $"{s.FirstName} {s.LastName}") as KeyValuePair<Guid, string>);
为什么原来的代码会报错?
你之前的代码里new { s.SystemUserId, Text = string.Format("{0} {1}", s.FirstName, s.LastName) }是在创建一个编译器自动生成的匿名类,它和KeyValuePair<Guid, string>是毫无关系的两种类型,编译器没有办法把匿名类实例隐式转换成KeyValuePair,所以就抛出了这个类型转换错误。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

