在.NET 6/C# 10中如何将List<String?>转换为List<String>并消除空性警告
问题原因
C# 编译器的可空引用类型静态分析不会跨LINQ方法边界追踪筛选条件的影响,即便你通过Where(x => !String.IsNullOrEmpty(x))已经完全过滤了null值,编译器仍然会将Where返回的序列元素判定为string?类型,因此赋值给List<string>类型的变量时就会触发类型不匹配警告。
修复方案
方案1:使用空宽恕运算符声明非空
在Select的返回值后添加!,手动告知编译器该值一定不为null:List<String> values = new List<String?> { null, "", "value" } .Where(x => !String.IsNullOrEmpty(x)) .Select(y => y!) .ToList();该方案修改成本最低,适合已经确认筛选逻辑完全排除null的场景。
方案2:使用
Cast<string>()做显式类型转换
筛选完成后直接调用Cast<string>方法完成可空到非空的类型转换,可省略冗余的Select调用:List<String> values = new List<String?> { null, "", "value" } .Where(x => !String.IsNullOrEmpty(x)) .Cast<string>() .ToList();方案3:用
OfType<string>()先过滤null再过滤空串OfType<string>()会自动剔除序列中的null值,同时将元素类型转换为非空string,后续只需额外过滤空字符串即可:List<String> values = new List<String?> { null, "", "value" } .OfType<string>() .Where(x => x != "") .ToList();
内容的提问来源于stack exchange,提问作者Miguel Moura
相关产品推荐
相关产品推荐

