Ответы, в которых говорится, что это проблема отложенного выполнения, неверны. Это проблема приоритета оператора.
Избавьтесь от всего этого совершенно неуместного и недоступного для чтения кода. Это все красная сельдь. Соответствующее воспроизведение:
decimal? d1 = 11.31m;
decimal? d2 = 11.28m;
decimal test1 = d1 ?? 0m;
decimal test2 = d2 ?? 0m;
decimal test3 = test1 + test2;
decimal test4 = d1 ?? 0m + d2 ?? 0m;
Что означает последняя строка? Означает ли это то же самое, что и строка перед ним?
Нет, это не так. Оператор сложения имеет более высокий приоритет , чем оператор объединения нулей, так что это
decimal test4 = d1 ?? (0m + d2) ?? 0m;
Код, который вы написали, означает «произвести значение d1, если d1 не равно нулю. Если d1 равно нулю, а 0m + d2 не равно нулю, тогда выведите значение 0m + d2. Если 0m + d2 равно нулю, то получите значение 0й. "
(Возможно, вы не знали, что у оператора ?? есть это приятное свойство цепочки. В общем, a ?? b ?? c ?? d ?? e
дает вам первое ненулевое значение a, b, c или d и e, если все они в противном случае все null. Вы можете делать цепочку сколько угодно. Это довольно элегантный маленький оператор.)
Поскольку d1 не равно нулю, мы создаем его значение, и test4 присваивается значение d1.
Вы, вероятно, хотели сказать:
decimal test4 = (d1 ?? 0m) + (d2 ?? 0m);
Если вы имеете в виду «d1 или d2 могут быть нулевыми, а если любой из них, то трактуйте нулевой как ноль». Таким образом, 12 + 2 равно 14, 12 + ноль равно 12, ноль + ноль равно 0
Если вы имеете в виду «либо d1 и d2 могут быть нулевыми, а если либо нулевым, то я хочу ноль», то это
decimal test4 = (d1 + d2) ?? 0m;
Итак, 12 + 2 равно 14, 12 + ноль равно 0, ноль + ноль равно 0
Хочу заметить, что если бы вы отформатировали свой код так, чтобы соответствующий текст был на экране, вы, вероятно, не получили бы пять или около того неправильных ответов, опубликованных первыми. Попробуйте отформатировать свой код так, чтобы все это было на экране; Вы получите лучшие ответы, если вы это сделаете.