[NotNullWhen(false)]特性未按预期工作问题咨询
问题分析与解决方案
你编写的C#函数中,error参数标记了[NotNullWhen(false)],约定当方法返回false时该参数非空,但编译器在返回false的分支中未正确推断可空枚举SomeEnum?的非空状态,导致类型转换报错。以下是几种可行的解决方法:
解决方案
1. 使用可空枚举的.Value属性取值
在返回false的分支中,直接通过.Value获取枚举值——根据[NotNullWhen(false)]的约定,此时error必然有值,不会抛出InvalidOperationException:
if (!GetRes(out var error, out var res)) { SomeEnum errValue = error.Value; // 正常使用errValue }
2. 使用null-forgiving操作符(!)
通过!显式告诉编译器该变量此时非空,绕过可空类型检查:
if (!GetRes(out var error, out var res)) { SomeEnum errValue = error!; // 正常使用errValue }
3. 模式匹配提取非空值
借助模式匹配直接将可空枚举转换为非空枚举类型,同时做非空校验:
if (!GetRes(out var error, out var res)) { if (error is SomeEnum errValue) { // 正常使用errValue } }
补充说明
[NotNullWhen]属性对值类型的可空类型(如SomeEnum?)的流分析逻辑,与引用类型的可空处理存在细微差异。编译器无法像引用类型那样自动将SomeEnum?推断为SomeEnum,但通过上述方法可以明确告知编译器变量的非空状态,解决类型转换问题。
内容的提问来源于stack exchange,提问作者ertucode
相关产品推荐
相关产品推荐

