You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();

这两种写法都能:

  1. 过滤掉Cognate为null或Cognate.Birth为null的记录
  2. 确保Δ.Birth非空后再访问其日期属性,避免空引用异常
  3. 让编译器准确推断类型,消除CS8073警告

内容的提问来源于stack exchange,提问作者Jason Hunter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:33:16