如何在C#三元运算符中正确使用await?
用三元运算符替代if-else实现异步逻辑的正确写法
可以用三元运算符实现,问题出在await的位置和表达式的使用方式上,以下是具体分析和解决方案:
原代码的问题
你原来的代码只await了IsReferencedFromAnotherTableAsync的结果,而三元运算符返回的Task(来自SoftUpdateAsync或UpdateAsync)并没有被await,导致异步任务未完成就继续执行后续逻辑,从而引发事务死锁。
错误写法的原因
你遇到的两个错误对应两种常见误用:
- “无法分配void类型的值”:如果尝试在三元分支里分别await方法(如
_ = condition ? await SoftUpdateAsync() : await UpdateAsync()),由于await Task的结果是void(非泛型Task无返回值),无法将void赋值给弃元_,因此报错。 - “只有赋值、调用...可用作语句”:如果直接写
await condition ? SoftUpdateAsync() : UpdateAsync(),编译器会将其解析为(await condition) ? SoftUpdateAsync() : UpdateAsync(),此时整个表达式的结果是Task,但C#不允许单独将Task表达式作为语句执行,因此报错。
正确写法
写法一:先获取判断结果,再await三元选择的Task
var isReferenced = await _tabRepository.IsReferencedFromAnotherTableAsync(entity.Id); await isReferenced ? _tabRepository.SoftUpdateAsync(entity) : _tabRepository.UpdateAsync(entity);
写法二:用括号明确优先级,直接await整个三元表达式
await (await _tabRepository.IsReferencedFromAnotherTableAsync(entity.Id) ? _tabRepository.SoftUpdateAsync(entity) : _tabRepository.UpdateAsync(entity));
这两种写法都会正确await异步更新方法,确保任务完成后再继续执行,避免事务死锁问题,效果和if-else写法完全一致。
内容的提问来源于stack exchange,提问作者rinomau
相关产品推荐
相关产品推荐

