如何在 .NET 6/C# 10 中将 List<String?> 转换为 List<String>?

How do I convert List<String?> to List<String> in .NET 6 / C# 10?

使用 .NET 6 我有以下内容:

List<String> values = new List<String?> { null, "", "value" }
  .Where(x => !String.IsNullOrEmpty(x))
  .Select(y => y)
  .ToList();

但我收到警告:

Nullability of reference types in value of type 'string?[]' doesn't match target type 'string[]'.

我认为使用

.Where(x => !String.IsNullOrEmpty(x))

会解决问题,但事实并非如此。如何解决这个问题?

这是您了解得更多的一种情况,可以通过 .Select(y => y!)

向编译器保证该值不是 null
List<string> values = new List<string?> { null, "", "value" }
   .Where(x => !string.IsNullOrEmpty(x))
   .Select(y => y!)
   .ToList();

注意 : .Select(y => y.Value) 不会起作用,因为字符串是 引用类型 string? 表示 可为 null 的引用类型 ,而不是 可为 null 的值类型

正如 @Patrick Artner 在评论中提到的那样。您也可以使用 .Cast<string>() 来达到类似的效果,它本质上只是一个迭代器和通用方法中的常规转换,从而确保您获得所需的结果。

List<string> values = new List<string?> { null, "", "value" }
   .Where(x => !string.IsNullOrEmpty(x))
   .Cast<string>()
   .ToList();

还有另一种方式(尽管推理起来有点困难)但可能更有效

List<string> values = new List<string?> { null, "", "value" }
   .Where(x => !string.IsNullOrEmpty(x))!
   .ToList<string>();  

您可以在 ToList 之后使用 null-forgiving 运算符而无需额外的 Select:

List<string> values = new List<string?> { null, "", "value" }
  .Where(x => !string.IsNullOrEmpty(x))
  .ToList()!;

sharplab.io