为什么这个 Int32 总和总是返回 0?

Why is this Int32 sum always returning 0?

我知道至少有一个值不为零并且总和仍然始终为 0
为什么?

get 
{
    Debug.WriteLine("ILockSumN");
    Debug.WriteLine(iLocks[2, 1] == (Int32?)null ? 0 : (Int32)iLocks[2, 1]);
    Debug.WriteLine(iLocks[3, 1] == (Int32?)null ? 0 : (Int32)iLocks[3, 1]);
    Debug.WriteLine(iLocks[6, 1] == (Int32?)null ? 0 : (Int32)iLocks[6, 1]);
    Int32 sum =
        iLocks[1, 1] == (Int32?)null ? 0 : (Int32)iLocks[1, 1] +
        iLocks[2, 1] == (Int32?)null ? 0 : (Int32)iLocks[2, 1] +
        iLocks[3, 1] == (Int32?)null ? 0 : (Int32)iLocks[3, 1] +
        iLocks[4, 1] == (Int32?)null ? 0 : (Int32)iLocks[4, 1] +
        iLocks[5, 1] == (Int32?)null ? 0 : (Int32)iLocks[5, 1] +
        iLocks[6, 1] == (Int32?)null ? 0 : (Int32)iLocks[6, 1];
    Debug.WriteLine(sum);
    return sum; 
} 

似乎是一个优先级问题 - 基本上如果 iLocks[1, 1]null 那么它需要 0 否则它使用具有所有添加的另一个分支。

尝试添加括号:

Int32 sum =
    (iLocks[1, 1] == (Int32?)null ? 0 : (Int32)iLocks[1, 1]) +
    (iLocks[2, 1] == (Int32?)null ? 0 : (Int32)iLocks[2, 1]) +
    (iLocks[3, 1] == (Int32?)null ? 0 : (Int32)iLocks[3, 1]) +
    (iLocks[4, 1] == (Int32?)null ? 0 : (Int32)iLocks[4, 1]) +
    (iLocks[5, 1] == (Int32?)null ? 0 : (Int32)iLocks[5, 1]) +
    (iLocks[6, 1] == (Int32?)null ? 0 : (Int32)iLocks[6, 1]);

7.12 Conditional operator 说:

The conditional operator is right-associative, meaning that operations are grouped from right to left. For example, an expression of the form a ? b : c ? d : e is evaluated as a ? b : (c ? d : e).

学术 LINQ 示例:

private IEnumerable<T> GetItems<T>(int j, T[,] array)
{
    var length = array.GetLength(0);
    for (int i = 0; i < length; i++)
    {
        yield return array[i, j];
    }
}

用法:

var sum = GetItems(1, iLocks)
    .Where(i => i != null)
    .Sum() ?? 0;

null coalescing 运算符也可以,在添加括号后(如 Michael 所述):

Int32 sum =
    (iLocks[1, 1] ?? 0) +
    (iLocks[2, 1] ?? 0) +
    (iLocks[3, 1] ?? 0) +
    (iLocks[4, 1] ?? 0) +
    (iLocks[5, 1] ?? 0) +
    (iLocks[6, 1] ?? 0);

或者,为了好玩,结合 LINQ:

Int32 sum = Enumerable.Range(1,6).Select(i => iLocks[i,1] ?? 0).Sum();