C#中??运算符两侧调用带out参数方法报CS0165错误的原因是什么
CS0165 报错核心原因
根本原因是C#编译器的明确赋值分析规则存在语法层面的限制,不会推导运行时的逻辑关联性:
- 明确赋值检测是纯静态语法检查,不会结合代码的运行时执行逻辑做推导,也不会将「抛出异常导致后续代码不会执行」的场景纳入判断依据,始终假设所有代码都会正常执行完成。
- 你代码中
(test as A)?.GetOut(out result1)这部分如果test as A为null,空条件运算符会直接截断后续调用,out result1的赋值逻辑完全不会执行。 - 虽然从实际执行逻辑看,空合并运算符
??左右两侧必走其一:要么左侧正常执行给result1赋值,要么走右侧代码,要么给result1赋值要么抛出异常直接终止、不会走到后续if (result1 == null)的行,正常走到使用点时result1必然已经赋值。但当前C#语言规范的明确赋值规则没有对??运算符的左右分支做赋值状态合并的支持,编译器不会识别「左侧未执行时右侧必然执行、且右侧一定会给out参数赋值」的逻辑,只会判定存在result1未被赋值就被使用的可能性,因此抛出CS0165错误。 - 等价的
if else分支写法不会触发报错,就是因为编译器可以识别两个分支都对变量做了赋值,但空条件+空合并的组合语法目前不在明确赋值分析的智能推导覆盖范围内。
内容的提问来源于stack exchange,提问作者Tatranskymedved
相关产品推荐
相关产品推荐

