三元内部的空融合算子

时间:2018-01-26 13:52:27

标签: c# ternary-operator null-coalescing-operator

我有这个C#代码:

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

我想要做的是检查计数是否为0,在这种情况下,变量的值应该设置为0。

如果count不同于0,我想用null-coalescing运算符检查该值是否存在,否则返回0。

我遇到的问题是我收到此错误消息:

  

指数超出范围。必须是非负数且小于   集合。参数名称:index

我的猜测是,即使data[j].Actual.Count为0,它也不会将结果设为0,但会尝试使用空合并运算符执行某些操作。

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

我认为问题在于作业;如果data[j].Actual为空(列表/数组/其他),那么您不能 data[j].Actual[0]分配给任何内容。如果这是数组,则无法执行任何(除非可能会创建新数组)。如果这是列表,则需要.Add一个值。

我会简化代码:

var actual = data[j].Actual;
if (actual.Count == 0)
{
    actual.Add(0);
    // or if this is an array: data[j].Actual = new double?[] {0}; 
}
else if (actual[0] == null)
{
    actual[0] = 0;
}

这不是一行,但很容易理解。

答案 1 :(得分:3)

仔细看看

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

您要分配给Actual[0]。如果Actual.Count为0,则超出范围异常。你不能使用三元。使用if语句。

if(data[j].Actual.Count != 0)
{
   data[j].Actual[0] = data[j].Actual[0] ?? 0;
}
// else you don't need to set anything because there is nothing to set!