.NET 6可空性注解未识别数组索引检查问题咨询
.NET 6可空性注解无法识别数组索引检查的原因
这不是代码分析器的Bug,而是静态可空分析的设计限制,属于有意的错误报告。
原因解释
C#的可空分析是静态检查,它没办法做到以下两点:
- 无法追踪数组索引
i在if(list[i] != null)判断之后,是否被其他代码修改(比如循环内部不小心改变了i的值); - 无法保证数组在
if判断和后续list[i]访问之间,没有被其他线程或外部代码修改(比如其他地方把list[i]重新赋值为null)。
出于安全性考虑,分析器会假设list[i]的状态可能在判断后发生变化,因此仍然提示“Possible NULL dereferencing”错误。
规避方法
正如你发现的,把数组元素赋值给局部变量即可解决问题:
public void Test() { string?[] list = new string[10]; list[0] = "A"; for (int i = 0; i < list.Length; i++) { var item = list[i]; if (item != null) { item.ToString(); // 无空引用提示 } } }
局部变量的状态是分析器可以完全追踪的,它能确定变量在if判断后不会被外部修改,因此不会再触发误报。
内容的提问来源于stack exchange,提问作者PMF
相关产品推荐
相关产品推荐

