三元内部的空合并运算符
Null-coalescing operator inside ternary
我有这个 C# 代码:
data[j].Actual[0] = data[j].Actual.Count != 0 ? (data[j].Actual[0] ?? 0) : 0;
我想做的是检查计数是否为 0,在这种情况下变量的值应该设置为 0。
如果计数不为 0,我想使用空合并运算符检查该值是否存在,否则 return 0.
我遇到的问题是收到此错误消息:
Index was out of range. Must be non-negative and less than the size of
the collection. Parameter name: index
我的猜测是,即使 data[j].Actual.Count
为 0,结果也不会为 0,但它会尝试使用空合并运算符做一些事情。
有什么建议吗?
仔细看
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!
我认为是作业的问题;如果 data[j].Actual
是空的 (list/array/whatever),那么你不能只是 assign data[j].Actual[0]
给任何东西。如果这是一个 array,你不能做 anything(除非创建一个新数组)。如果这是一个列表,您需要.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;
}
这不是一行,但很容易理解。
我有这个 C# 代码:
data[j].Actual[0] = data[j].Actual.Count != 0 ? (data[j].Actual[0] ?? 0) : 0;
我想做的是检查计数是否为 0,在这种情况下变量的值应该设置为 0。
如果计数不为 0,我想使用空合并运算符检查该值是否存在,否则 return 0.
我遇到的问题是收到此错误消息:
Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
我的猜测是,即使 data[j].Actual.Count
为 0,结果也不会为 0,但它会尝试使用空合并运算符做一些事情。
有什么建议吗?
仔细看
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!
我认为是作业的问题;如果 data[j].Actual
是空的 (list/array/whatever),那么你不能只是 assign data[j].Actual[0]
给任何东西。如果这是一个 array,你不能做 anything(除非创建一个新数组)。如果这是一个列表,您需要.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;
}
这不是一行,但很容易理解。