为何Nullable引用类型无中间变量时触发警告?代码问题咨询
问题原因解析
核心差异:?.的短路特性
问题出在空传播运算符?.的短路行为上:
- 当
cfg为null时,cfg?.GetChildren().EmptyIfNull()会直接返回null,根本不会执行后面的.EmptyIfNull()方法。这时候整个表达式的结果是null,赋值给不可空的IEnumerable<IConfigurationSection>变量,自然触发“可能的null值转换为非nullable类型”的警告。 - 而前两行的逻辑是:先把
cfg?.GetChildren()的结果(可能为null)赋值给可空变量myChildren,再主动调用EmptyIfNull()方法——不管myChildren是不是null,这个方法都会被执行,加上方法标注了[return: NotNull],编译器能确定返回值非空,所以赋值给不可空变量没问题。
解决方案
只要确保EmptyIfNull()一定会被调用,就能避免警告,常见两种写法:
1. 给空传播表达式加括号,调整执行优先级
IEnumerable<IConfigurationSection> safeChildren2 = (cfg?.GetChildren()).EmptyIfNull();
这样不管cfg是不是null,cfg?.GetChildren()的结果(可能为null)都会传入EmptyIfNull(),方法保证返回非空值。
2. 直接用空合并运算符替代
IEnumerable<IConfigurationSection> safeChildren2 = cfg?.GetChildren() ?? Array.Empty<IConfigurationSection>();
效果和你的扩展方法一致,也能避免警告。
内容的提问来源于stack exchange,提问作者Medinoc
相关产品推荐
相关产品推荐

