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

nvo*_*igt 1 c# nullable nullable-reference-types

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

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

var actualNonNullValues = nullableItems.Where(x => x.HasValue)
                                       .Select(x => x.Value)
                                       .ToList();
Run Code Online (Sandbox Code Playgroud)

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

!我知道我可以通过将 an 应用于来告诉编译器关闭x,但看起来我作弊了。在我使用的其他语言中,不得不依赖于此被认为是不好的做法,意味着你做错了什么。

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

Zde*_*nek 5

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

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

你唯一的选择就是!“我知道我在这里做什么”。

有一个语言问题跟踪此问题:https ://github.com/dotnet/csharplang/issues/3951