使用ForEachAsync时出现CS0103错误:Lambda参数“c”未识别
解决CS0103错误:Lambda参数“c”找不到的问题
嘿,先看你修改后的代码,问题其实很明显:
_appDbContext.Categories.ForEachAsync(c => _categoriesDictionary.Add(c.Id, c.CategoryName)));
直接触发错误的原因:多了一个多余的括号
你在ForEachAsync调用的结尾多写了一个闭合括号!正确的写法应该是:
await _appDbContext.Categories.ForEachAsync(c => _categoriesDictionary.Add(c.Id, c.CategoryName));
这个多余的括号把编译器搞懵了——它没法正确识别Lambda表达式的范围,自然就找不到你定义的参数c,所以抛出了CS0103错误。这也是为什么你其他地方的Lambda表达式能正常工作:那些代码没有这种语法错误,编译器能正确解析参数的上下文。
还有两个重要的坑要避开
除了这个语法错误,还有两个点得提醒你:
- 异步方法必须用await等待:
ForEachAsync是异步方法,如果你直接调用不加await,会导致异步操作没被等待,很可能引发线程问题或者数据不一致的情况。 - Dictionary不是线程安全的:
Dictionary<int, string>本身不是线程安全的集合,而ForEachAsync内部是异步遍历,可能会在多个线程里执行Add操作,这会触发竞态条件,甚至直接抛出异常。如果你的分类数据量不大,更稳妥的做法是先把数据同步拉取到本地列表,再填充字典:
var categories = await _appDbContext.Categories.ToListAsync(); foreach (var category in categories) { _categoriesDictionary.Add(category.Id, category.CategoryName); }
这样既解决了语法错误,也保证了代码的安全性和正确性。
内容的提问来源于stack exchange,提问作者ejdrian313
相关产品推荐
相关产品推荐

