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,再进行后续访问。以下是几种可行写法:
- 转换为
JObject后使用空条件运算符:
var fullName = (obj["name"] as JObject)?["fullName"];
- 利用
JToken的HasValues属性判断是否有子节点:
var nameToken = obj["name"]; var fullName = nameToken?.HasValues == true ? nameToken["fullName"] : null;
- 直接判断是否为null值的
JValue:
var nameToken = obj["name"]; var fullName = !(nameToken is JValue jv && jv.Value == null) ? nameToken["fullName"] : null;
内容的提问来源于stack exchange,提问作者pr0mpT_07
相关产品推荐
相关产品推荐

