Я заметил что-то очень странное при работе с добавлением обнуляемых поплавков. Возьмите следующий код:
float? a = 2.1f;
float? b = 3.8f;
float? c = 0.2f;
float? result =
(a == null ? 0 : a)
+ (b == null ? 0 : b)
+ (c == null ? 0 : c);
float? result2 =
(a == null ? 0 : a.Value)
+ (b == null ? 0 : b.Value)
+ (c == null ? 0 : c.Value);
result 6.099999, тогда как result2 - 6.1. Мне повезло, что я наткнулся на это, потому что, если я изменил значения для a, b и c, поведение, как правило, выглядит правильным. Это также может случиться с другими арифметическими операторами или другими типами значений NULL, но это случай, когда я смог воспроизвести. Я не понимаю, почему в первом случае неявное преобразование в float из float? работало некорректно. Я мог бы понять, попытался ли получить значение int, учитывая, что другая сторона условного выражения 0, но это не похоже на то, что происходит. Учитывая, что result отображается некорректно для некоторых комбинаций значений с плавающей запятой, я предполагаю, что это какая-то проблема округления с несколькими преобразованиями (возможно, из-за бокса/распаковки или чего-то еще).
Любые идеи?