2015-01-12 2 views
1

Я знаю, что хотя бы одно значение не равно нулю, а сумма все равно всегда 0
Почему?Почему эта сумма Int32 всегда возвращает 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; 
} 

ответ

3

Похоже проблема старшинства - в основном, если 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 говорит:

Условный оператор является правоассоциативной, а это означает, что операции группируются справа налево. Например, выражение вида a? До нашей эры ? d: e оценивается как? b: (c? d: e).

+0

Я просто подумал об этом самостоятельно. Мне нужно подождать 7 минут, чтобы согласиться. – Paparazzi

2

Academic 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; 
+0

Сладкий синтаксис - еще 3 – Paparazzi

2

Оператор null coalescing тоже будет работать, после добавления скобок (как отмечает Майкл):

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(); 
Смежные вопросы