代码之家  ›  专栏  ›  技术社区  ›  Leo Messi

三元内部的空合并运算符

  •  1
  • Leo Messi  · 技术社区  · 7 年前

    我有这个C代码:

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

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

    如果计数不同于0,我想使用null合并运算符检查该值是否存在,否则返回0。

    我遇到的问题是,我收到以下错误消息:

    索引超出范围。必须为非负数且小于 集合。参数名称:索引

    我猜即使 data[j].Actual.Count 如果为0,则结果不是0,但它尝试使用null合并运算符进行操作。

    有什么建议吗?

    2 回复  |  直到 7 年前
        1
  •  5
  •   Marc Gravell    7 年前

    我认为问题在于任务;如果 data[j].Actual 是空的(列表/数组/任何东西),那么您不能 分配 data[j].Actual[0] 对任何事。如果这是 大堆 ,你不能这样做 任何东西 (除了可能创建新阵列)。如果这是 列表 ,您需要 .Add a值。

    我会简化代码:

    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;
    }
    

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

        2
  •  3
  •   M.kazem Akhgary    7 年前

    仔细观察

    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!