C# 匿名对象中使用三元表达式返回默认集合时出现Add方法重载报错
报错原因
- 直接报错点:List集合初始化语法错误。你写的
new List<Dictionary<string, int>> { { "CurrentChapter", 0 }, { "Completed", 0 } }试图直接向List中传入两个键值对,编译器会匹配List的Add方法,而List的Add方法仅支持传入1个参数(即单个Dictionary对象),不存在接收2个参数的Add重载,因此触发报错。 - 隐藏逻辑错误:你写的判断条件
c.Progress.ToList().Select(x => new { x.CurrentChapter, x.Completed }) != null永远为真,因为LINQ的Select方法返回的IEnumerable对象不可能为null,即便Progress没有数据,也只会返回空集合而非null,因此这个三元判断永远不会走到兜底分支。 - 隐藏类型不兼容错误:三元表达式要求两个分支的返回类型必须兼容,你前一个分支返回的是匿名类型的IEnumerable,后一个分支原本想返回Dictionary集合,二者类型完全不匹配,即便修复初始化语法,也会触发编译错误。
修复方案
首先统一前后分支的返回类型,都使用相同结构的匿名对象,同时把判断条件改为检查Progress是否存在数据。如果你的Progress导航属性可能为null,可将判断条件改为c.Progress?.Any() == true避免空引用异常。修正后的代码如下:
var courses = await _context.courses .Include(c => c.Progress) .ToListAsync(); var myCourses = courses .Select(c => new { Title = c.Title, Progress = c.Progress.Any() ? c.Progress.Select(x => new { x.CurrentChapter, x.Completed }).ToList() : new List<object> { new { CurrentChapter = 0, Completed = 0 } } }) .ToList(); return Ok(myCourses);
如果框架序列化时对匿名类型兼容有问题,也可以显式声明Dto类替代匿名类型,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Sami-L
相关产品推荐
相关产品推荐

