You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#三元运算符中正确使用await?

用三元运算符替代if-else实现异步逻辑的正确写法

可以用三元运算符实现,问题出在await的位置和表达式的使用方式上,以下是具体分析和解决方案:

原代码的问题

你原来的代码只await了IsReferencedFromAnotherTableAsync的结果,而三元运算符返回的Task(来自SoftUpdateAsync或UpdateAsync)并没有被await,导致异步任务未完成就继续执行后续逻辑,从而引发事务死锁。

错误写法的原因

你遇到的两个错误对应两种常见误用:

  1. “无法分配void类型的值”:如果尝试在三元分支里分别await方法(如_ = condition ? await SoftUpdateAsync() : await UpdateAsync()),由于await Task的结果是void(非泛型Task无返回值),无法将void赋值给弃元_,因此报错。
  2. “只有赋值、调用...可用作语句”:如果直接写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:12:39