C#10中对object?做空判断仍触发CS8600警告的原因是什么?
问题原因分析
这个警告的根本原因和tmp的可空性校验无关,你已经通过if (tmp is null)正确排除了tmp为null的情况,触发警告的是object.ToString()方法的返回值可空性注解。
- .NET 6 配套的基础类库已经全面补全了可空引用类型注解,
object类的ToString()方法签名被更新为public virtual string? ToString(),即允许返回null值。 - 你代码中
oldValue是string类型的非可空变量,将可能为null的ToString()返回值直接赋值给非可空变量,就会触发CS8600警告。 - 这类警告高频出现的原因是:.NET 6及以上版本新建项目默认启用可空引用类型检查,迁移项目如果没有手动关闭该特性,所有涉及可空注解API的调用都会被静态检查,符合条件就会触发警告。
常见解决方法
- 如果你确定当前场景下
tmp的实际类型的ToString()实现永远不会返回null,可以用null抑制运算符消除警告:
oldValue = tmp.ToString()!;
- 如果无法保证
ToString()的返回值非空,可以加兜底逻辑处理null情况:
oldValue = tmp.ToString() ?? string.Empty;
- 也可以合并原有逻辑为更简洁的三元表达式写法:
oldValue = tmp is null ? string.Empty : tmp.ToString() ?? string.Empty;
内容的提问来源于stack exchange,提问作者UnusualWays
相关产品推荐
相关产品推荐

