You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

三元运算符内用空合并运算符致C#索引越界问题求助

解决C#集合索引越界问题的方案

嘿,我一下子就找到你代码里的问题啦!

错误根源

你现在的代码是这样的:

data[j].Actual[0] = data[j].Actual.Count != 0 ? (data[j].Actual[0] ?? 0) : 0;

问题出在赋值操作的左边——当data[j].Actual.Count为0时,这个集合里根本没有索引为0的元素,你试图给一个不存在的元素赋值,不管右边的三元运算符返回什么值,都会先触发索引越界异常,这和三元运算符的短路逻辑无关哦。

结合你的需求来看,我猜你大概率是想把某个变量赋值为目标值,而不是直接修改Actual集合的元素?如果是这样的话,咱们调整一下代码结构就能解决问题。

解决方案1:赋值给变量(符合你的核心需求)

把赋值目标改成一个变量,而不是集合的索引项:

// 定义一个变量来接收结果
var targetValue = data[j].Actual.Count != 0 ? (data[j].Actual[0] ?? 0) : 0;

这样就安全了:三元运算符会先判断Count是否为0,只有当Count不为0时,才会执行data[j].Actual[0] ?? 0的逻辑,完全不会触发索引越界。

解决方案2:如果确实要修改Actual集合

如果你真的是想修改Actual集合(比如空集合时添加0,非空时把第一个元素设为非空值或0),那需要先确保集合里有索引0的元素再赋值:

if (data[j].Actual.Count == 0)
{
    // 空集合时直接添加0元素
    data[j].Actual.Add(0);
}
else
{
    // 非空时用空合并赋值运算符简化逻辑
    data[j].Actual[0] ??= 0;
}

这种写法会先处理空集合的情况,避免直接访问不存在的索引。

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

火山引擎 最新活动