LINQ中空值子对象处理:排除Birth为Null的Cognate的查询方法
LINQ空值处理与CS8073警告解决
问题根源
初始代码因Cognate和Birth为Nullable类型,直接访问Birth.Year/Month/Day触发空值警告;添加空值检查后出现CS8073警告,原因是:在确认x.Cognate.Birth != null后,编译器判定它是非Nullable的DateTime类型,但Δ.Birth仍是NullableΔ.Birth.Year,当Δ.Birth为null时会触发空引用异常,且编译器会误判表达式逻辑(DateTime类型永远不可能等于DateTime?类型的null)。
另外,你尝试用??运算符无效,是因为??的作用是为null值提供默认值,而非过滤掉null记录,不符合你排除Birth为null的Cognate记录的需求。
解决方案
方案1:使用Nullable的HasValue和Value属性
bookings = bookings .Where(x => x.Cognate != null && x.Cognate.Birth.HasValue && Δ.Birth.HasValue && x.Cognate.Birth.Value.Year == Δ.Birth.Value.Year && x.Cognate.Birth.Value.Month == Δ.Birth.Value.Month && x.Cognate.Birth.Value.Day == Δ.Birth.Value.Day) .ToList();
方案2:C# 8+空值模式匹配(更简洁)
bookings = bookings .Where(x => x.Cognate is not null && x.Cognate.Birth is DateTime cognateBirth && Δ.Birth is DateTime deltaBirth && cognateBirth.Year == deltaBirth.Year && cognateBirth.Month == deltaBirth.Month && cognateBirth.Day == deltaBirth.Day) .ToList();
这两种写法都能:
- 过滤掉
Cognate为null或Cognate.Birth为null的记录 - 确保
Δ.Birth非空后再访问其日期属性,避免空引用异常 - 让编译器准确推断类型,消除CS8073警告
内容的提问来源于stack exchange,提问作者Jason Hunter
相关产品推荐
相关产品推荐

