#nullable disable场景下使用NotNullWhenAttribute消除空引用警告咨询
问题
在#nullable disable场景下,如何使用NotNullWhen特性,是否有可实现同等效果的替代方案?
示例场景
我定义了如下扩展方法:
public static bool IsNullOrEmpty<T>([NotNullWhen(false)] this IEnumerable<T> e) { return e == null || !e.Any(); }
调用代码如下:
if(ids.IsNullOrEmpty()) { throw new Exception(); } var id = ids.First();
此时编译器在ids.First()处抛出警告:
Possible 'System.NullReferenceException'
当我开启#nullable enable时该警告会消失,我希望在#nullable disable场景下也能实现相同的效果,请问是否可行?
更新:问题对应截图:
回答
NotNullWhen属于C#可空引用类型体系下的静态分析特性,仅在开启#nullable enable时才会被编译器识别并参与流分析,#nullable disable场景下整个可空静态分析逻辑默认关闭,因此直接使用NotNullWhen无法生效,没有办法直接通过这个特性达到你要的效果。
如果一定要在全局#nullable disable的配置下消除该警告,可以使用以下替代方案:
- 局部开启可空分析:在当前代码文件的首行添加
#nullable enable,仅对当前文件生效,不会影响全局的可空关闭配置,也是成本最低的方案,可以直接复用你已经写好的NotNullWhen特性。 - 使用null包容运算符强制消警:将调用代码修改为
var id = ids.First()!;,手动告知编译器你确认此时ids不为null,不需要抛出警告。 - 调整判断逻辑不使用扩展方法:将分支判断直接改为
if (ids == null || !ids.Any()),编译器原生静态分析可以直接识别该判断逻辑,不会抛出空引用警告。 - 增加显式断言:在调用
First前添加一行Debug.Assert(ids != null);,编译器也能识别该断言,确定后续代码中ids不会为null。
需要注意:#nullable disable场景下所有可空相关的特性都不会生效,如果不想局部开启可空配置,只能通过手动标记或调整原生判断逻辑的方式消除警告。
内容的提问来源于stack exchange,提问作者Artur
相关产品推荐
相关产品推荐

