Visual Studio 2022中CS8602误报:已做空检查仍提示空引用风险
关于C#中CS8602警告的疑问(已做空检查仍触发)
使用Visual Studio 2022(C# .NET 6.0)时,遇到如下问题:即便已对parameter.Input进行空值或空白检查,仍收到CS8602警告("Dereference of a possibly null reference",即可能为空引用的解引用)。
代码片段如下:
public interface IParameter { public string? Input { get; set; } } public static class FalseWarningTest { public static string[] SeeTheFalseWarning(this IParameter parameter) { if (string.IsNullOrWhiteSpace(parameter.Input)) { throw new InvalidOperationException("Input must have value"); } return parameter.Input.Split(':'); } }
尽管在使用parameter.Input前已检查其是否为空或空白,Visual Studio仍在parameter.Input.Split(':')处提示它可能为空。
但当显式增加null检查(本应是冗余操作)后,警告消失:
public static string[] SeeTheFalseWarning(this IParameter parameter) { if (parameter.Input == null || string.IsNullOrWhiteSpace(parameter.Input)) { throw new InvalidOperationException("Input must have value"); } return parameter.Input.Split(':'); }
我明白CS8602警告是用于防范空引用异常的特性,但这种已做空检查仍触发警告的情况,是编译器Bug还是我的理解存在误区?
编辑1:
将parameter.Input存入局部变量后再做空/空白检查,仍会触发相同的CS8602警告。具体场景为:将值赋值给局部变量input,执行if (string.IsNullOrWhiteSpace(input))后抛出异常,后续调用input.Split(':')时依然出现CS8602警告。
编辑2:
后续发现代码实际是基于.NET Standard 2.0编写的,在纯.NET 6环境下测试相同代码时,未收到该警告。由于不喜欢使用空原谅操作符!,最终采用string input = parameter.Input ?? string.Empty;作为安全简便的规避方案。
内容的提问来源于stack exchange,提问作者Toshi
相关产品推荐
相关产品推荐

