NET 6启用Nullable后values1.Count报可空值类型可能为空警告如何解决
问题原因
触发警告和编译错误的根源有两个:
- 开启可空引用类型校验后,编译器默认
values1、values2两个参数可能为null,直接访问.Count、索引器都会触发「可能为null」的警告 - 你使用
values1?.Count语法后,返回值是int?(可空int),而索引器只接收非空int类型参数,所以会报类型转换错误
解决方案
第一步先做前置参数校验,把参数为null、长度不足的边界情况先排除,校验通过后编译器会自动识别到后续代码中values1、values2肯定不为空,且长度足够访问倒数第二个元素,自然就不会再报相关警告。
第二步用模式匹配提取集合中的非空值,避免手动访问.Value产生的警告,代码更简洁易读。
修正后完整代码
protected bool CrossBelow<T>(IList<Nullable<T>> values1, IList<Nullable<T>> values2) where T : struct, IComparable { // 前置校验:排除参数为null、长度不足2的情况 if (values1 == null || values2 == null || values1.Count < 2 || values2.Count < 2) return false; // 用模式匹配提取非空值,同时完成判空 if (values1[^2] is not T v1Prev || values1[^1] is not T v1Last || values2[^2] is not T v2Prev || values2[^1] is not T v2Last) { return false; } // 直接用提取后的非空值做比较 return v1Prev.CompareTo(v2Prev) > 0 && v1Last.CompareTo(v2Last) < 0; }
补充说明
代码中的[^n]是C# 8及以上版本支持的「从末尾索引」语法,[^2]等价于你之前写的[Count - 2],[^1]等价于.Last(),语法更简洁。
如果你需要兼容旧版本C#,把[^2]换回[values1.Count - 2]、[^1]换回.Last()即可,只要加上前置参数校验,就不会再有警告。
内容的提问来源于stack exchange,提问作者Miguel Moura
相关产品推荐
相关产品推荐

