解构元组模式匹配:异步方法返回值匹配报错问题
问题原因
这个报错的核心是C#语法解析规则的限制:
当你在if条件的is表达式中使用显式类型的声明式模式(比如(Boolean result, MyObject value)这种带具体类型的解构声明),编译器不允许把这种声明和后续的逻辑运算符(比如&&)放在同一个条件判断的初始分支里。
而你用var ret的写法能正常工作,是因为var属于隐式类型的变量模式,C#编译器对这种模式的语法约束更宽松,允许它和逻辑运算符组合在if条件中。
解决方法
这里有几种实用的解决方案,你可以根据场景选择:
方案1:先缓存异步结果,再判断(最直观)
把await的结果先存到变量里,再进行判断和解构,完全规避语法限制,可读性也最高:
var getResult = await TryGetAsync(); if (getResult.result) { // 使用 getResult.value }
方案2:直接解构到变量,再判断(最简洁)
利用C#的解构赋值特性,一步把结果拆成两个变量,再判断成功状态:
var (isSuccess, targetValue) = await TryGetAsync(); if (isSuccess) { // 使用 targetValue }
方案3:在if条件中使用隐式类型解构(适合想写在一行的场景)
如果坚持要把逻辑写在if条件里,可以去掉显式类型声明,用var来做隐式解构,编译器会自动推断类型,这样就不会触发报错:
if ((await TryGetAsync()) is (var result, var value) && result) { // 使用 value }
内容的提问来源于stack exchange,提问作者David S.
相关产品推荐
相关产品推荐

