使用LINQ转换列表模型时遇类型转换错误,求解决方案
问题解决:LINQ转换模型时的类型错误与赋值问题
错误原因分析
你遇到的问题有两个核心点:
AddRange方法返回值为void:不能将AddRange的调用结果直接赋值给ToRecipients,因为该方法仅修改已有列表,不返回任何对象。- 重载匹配歧义:编译器尝试将
IEnumerable<Recipient>匹配到AddRange的ReadOnlySpan<T>重载,触发类型转换错误。
正确的LINQ一行写法
直接使用LINQ的ToList()方法,将查询结果转换为List<Recipient>,同时处理email.To可能为null的情况:
ToRecipients = email.To?.Select(contact => new Recipient { EmailAddress = new EmailAddress { Address = contact.EmailAddress, Name = contact.Name // 可选:如果Recipient的EmailAddress需要Name字段,可一并赋值 } }).ToList() ?? new List<Recipient>();
代码说明
email.To?.Select(...):用空条件运算符?.避免email.To为null时触发NullReferenceException。.ToList():将LINQ生成的IEnumerable<Recipient>直接转为List<Recipient>,完全匹配ToRecipients的类型要求。?? new List<Recipient>():当email.To为null时返回空列表,确保ToRecipients始终不为null,和你的模型默认值习惯保持一致。
原写法问题拆解
new List<Recipient>().AddRange(...):创建新列表后调用AddRange,但AddRange不返回列表本身,因此赋值给ToRecipients的是void,本身就是语法错误。- 编译器重载匹配错误:
IEnumerable<T>可隐式转换为部分Span类型,导致编译器误匹配AddRange(ReadOnlySpan<T>)重载,引发类型转换报错。
内容的提问来源于stack exchange,提问作者Qiuzman
相关产品推荐
相关产品推荐

