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

Null-条件运算符?[]遇null数据报错,求解释evaluates含义

关于C#空条件运算符中"evaluates"的含义及Newtonsoft.Json报错问题

微软文档中"evaluates为null"的含义

这里的evaluates指的是表达式计算后得到的是null引用——也就是左边的表达式没有指向任何有效的对象实例。空条件运算符?./?[]的核心逻辑是:只有当左边表达式的结果是null引用时,才会直接返回null,跳过后续的成员/索引访问;如果左边是一个非null的对象(哪怕这个对象内部的值是null),运算符会正常执行后面的访问操作。

你的报错原因

从MongoDB拿到的obj["name"]并不是null引用,而是一个Newtonsoft.Json.Linq.JValue类型的实例——这个实例的内部值是null,但它本身是一个存在的、有效的非null对象。所以obj["name"]?["fullName"]里的?[]不会触发短路逻辑,而是会尝试对这个JValue实例调用索引器。但JValue是JSON的叶子节点(比如字符串、数字、null值这类),没有子节点,因此会抛出"Cannot access child value on Newtonsoft.Json.Linq.JValue."的错误。

解决办法

你需要先判断obj["name"]是否是可包含子节点的类型(比如JObject),或者判断它是否为代表null值的JToken,再进行后续访问。以下是几种可行写法:

  1. 转换为JObject后使用空条件运算符:
var fullName = (obj["name"] as JObject)?["fullName"];
  1. 利用JToken的HasValues属性判断是否有子节点:
var nameToken = obj["name"];
var fullName = nameToken?.HasValues == true ? nameToken["fullName"] : null;
  1. 直接判断是否为null值的JValue:
var nameToken = obj["name"];
var fullName = !(nameToken is JValue jv && jv.Value == null) ? nameToken["fullName"] : null;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:45:58