启用CS8602时如何避免可空性警告/错误?
解决.NET 8可空引用类型下扩展方法的CS8602警告
问题场景
现有遗留代码库中的辅助扩展方法:
public static class ListHelper { public static bool HasAny<T>(this IReadOnlyCollection<T>? list) { return list != null && list.Count > 0; } }
当在.NET 8项目中启用可空引用类型后,以下使用场景会触发CS8602警告(或错误,取决于配置):
List<string>? fileNames2 = null; if (fileNames2.HasAny()) { var aasd = fileNames2[0]; // CS8602 Dereference of a possibly null reference. }
错误信息详情:
Severity Code Description Error (active) CS8602 Dereference of a possibly null reference.
虽然HasAny方法已经处理了null判断,if代码块内的变量不可能为null,但编译器无法识别这一点。而以下写法虽然能解决问题,但违背了使用该扩展方法的初衷:
if (fileNames2?.Any() == true) { var aasd = fileNames2[0]; }
解决方案
给HasAny方法的参数添加[NotNullWhen(true)]特性,让编译器明确知道:当方法返回true时,传入的list参数不为null。
修改后的扩展方法代码:
using System.Diagnostics.CodeAnalysis; public static class ListHelper { public static bool HasAny<T>([NotNullWhen(true)] this IReadOnlyCollection<T>? list) { return list != null && list.Count > 0; } }
此时再使用原代码:
List<string>? fileNames2 = null; if (fileNames2.HasAny()) { var aasd = fileNames2[0]; // 不再触发CS8602警告 }
原理说明
[NotNullWhen(true)]是.NET的可空引用类型特性之一,它用于告诉静态分析器:当方法返回指定的布尔值(这里是true)时,标记的参数将不为null。这样编译器就能正确推断出if块内的fileNames2是非null状态,从而消除警告。
内容的提问来源于stack exchange,提问作者h0wXD
相关产品推荐
相关产品推荐

