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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:02:38