You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:54:05