可空类型产生警告,因为项目启用了可空引用类型
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
我只在启用可空引用类型后才收到警告,但具体示例实际上是很好的旧 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