【问题标题】:Null-coalescing operator inside ternary三元内的空合并运算符
【发布时间】:2018-07-05 20:54:41
【问题描述】:

我有这个 C# 代码:

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

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

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

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

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

我的猜测是,即使 data[j].Actual.Count 为 0,它的结果也不会为 0,但它会尝试使用 null-coalescing 运算符做一些事情。

有什么建议吗?

【问题讨论】:

  • Any suggestions? 不要花里胡哨,只写可读的代码
  • 这里有哪些类型? data[j].Actual 是什么?
  • 您的问题是,data[j].Actual[0] ?? 0 仍在尝试访问索引 0 处的项目。如果该集合没有项目,则 null-coalesce 不会保存异常。您必须检查它是否至少包含一项。
  • @MarcGravell double?的列表
  • @Jonesopolis 如果Count0,则该部分将永远不会被访问;问题出在左侧

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


【解决方案1】:

我认为问题在于分配;如果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;
}

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

【讨论】:

    【解决方案2】:

    仔细看看

    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!
    

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 2018-03-12
      • 2018-02-04
      • 2012-01-13
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 2012-09-19
      • 2018-07-13
      相关资源
      最近更新 更多