C#中访问元素时?的作用是什么?数组索引场景为何报错?
空值运算符
?.在数组索引场景的实际作用解析 先看你遇到的问题代码:
var value = PlayerGroup?.Players?[0]?.jsonData?.playerSetting?.useChat?.value ?? true;
你预期:当PlayerGroup.Players为null或数组无元素时,value等于true;
实际结果:抛出ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
?.在此场景的实际作用
?.(空条件运算符)的核心逻辑是:仅当左侧的对象/变量不为null时,才执行右侧的成员访问、方法调用或索引操作;如果左侧是null,直接返回null,终止后续链式调用。- 针对代码里的
Players?[0]:这里的?.只会检查Players是否为null——如果Players是null,Players?[0]直接返回null,后续的链式访问都会短路,最终触发?? true得到预期结果;但如果Players是空数组(长度为0),?.不会校验数组的长度,会直接执行[0]索引访问,这时候就会抛出索引越界异常,因为空数组没有索引为0的元素。 - 简单说:
?.只处理null的情况,完全不负责判断集合/数组是否为空,这就是你代码不符合预期的根本原因。
修正示例
如果要同时处理Players为null和数组为空的情况,可以用LINQ的ElementAtOrDefault方法替代直接索引:
var value = PlayerGroup?.Players?.ElementAtOrDefault(0)?.jsonData?.playerSetting?.useChat?.value ?? true;
ElementAtOrDefault(0)会在数组为空时返回null,后续链式访问短路,最终触发?? true得到预期的true值。
内容的提问来源于stack exchange,提问作者HardcoreGamer
相关产品推荐
相关产品推荐

