可空类型产生警告,因为项目启用了可空引用类型

Nullable type producing warnings since project has enabled nullable reference types

我只在启用可空引用类型后才收到警告,但具体示例实际上是很好的旧 Nullable<T> 类型:

var nullableItems = new List<int?>();

var actualNonNullValues = nullableItems.Where(x => x.HasValue)
                                       .Select(x => x.Value)
                                       .ToList();

所以我整理了所有的空值,只想要实际的非空项。但是,.Select(x => x.Value) 部分会给我一个关于 x 可能在这里为空的编译器警告。从逻辑上讲,它不是,但是对于编译器来说,类型还没有改变,它仍然是一个 int?.

我知道我可以通过将 ! 应用于 x 来告诉编译器闭嘴,但我好像作弊了。在我使用的其他语言中,不得不退回到这个被认为是不好的做法,意味着你做错了什么。

我还有哪些其他选择?我可以做得比在这里使用 ! 更好吗?

Select(x => x.Value) 中,x 属于 int? 类型,因此编译器会立即警告您对该类型调用 .Value 可能会抛出异常。

这没有多大意义,因为您已经在 .Where(x => x.HasValue) 中检查了可空性。不幸的是,C# 编译器目前不理解 Select 将仅接收非空值,因为它的上下文不理解 Where 方法语义。

您唯一的选择是 !,因为它说“我知道我在这里做什么。”

跟踪此问题存在语言问题:https://github.com/dotnet/csharplang/issues/3951