Игнорирование комментариев (которые действительны) и ответ на ваш вопрос:
m => m(randomNumber) != null
всегда будет правдой. Возврат от вашего предиката всегда будет true
или false
, а не null
, поэтому, когда вы установите randomNumber = 8
, вы получите -2
: false != null
-> true
-> 2.0 *= -1
is -2
.
Во-вторых, когда вы не соответствуете ни одному из ваших предикатов, ваш ключ (возвращаемый результат FirstOrDefault()
будет нулевым, и вы не обрабатываете это.
Вы либо должны использовать несколько строк (проверка на ноль), либо иметь универсальную запись, как подсказывает Эвк. Решение Mjwills тоже работает, оно называется условным оператором null .
Кроме того, если вы используете предикат .First(m => m(randomNumber))
, вы можете полностью удалить предикат Where
, уменьшив сложность по времени до уровня, сравнимого с повторяющимся List<>
.