Непосредственная проблема заключается в том, что лямбда-оболочка объединяет много сложной логики в одном выражении, поэтому вы не можете найти, где произошел сбой.
Но это всего лишь побочный эффект. Проблема real в том, что ваш код предполагает, неправильно , что ни одна из ссылок не будет нулевой.
Один из подходов состоит в том, чтобы попытаться изолировать аварию и наложить повязку на «сломавшийся бит». Но это не приведет к корню проблемы: в коде есть непроверенные предположения, и у вас уже есть доказательства того, что хотя бы одно из них неверно. Если другой неверен, то в какой-то неопределенный момент в будущем ваша программа, вероятно, снова выйдет из строя, и вы снова будете отлаживать и перевязывать. Это может продолжаться и продолжаться, и ваш код будет взламываться каждый раз.
Вам нужно положить свой отладчик и подумать о коде. Весь код за один проход. Проверь его: проверь каждую часть выражения и спроси себя: «Может ли этот бит быть нулевым? Что произойдет, если он есть? И если да, то как я могу сделать его безопасным?»
Таким образом, вы сможете переписать все выражение в форме, которая, как вам известно, не имеет смысла, и вам никогда не понадобится отлаживать ее, чтобы понять, почему она взорвалась.
Например, это:
r.RegistrationCountry.IsUSAOrCandada() &&
... может вызвать нулевую разыменование, если r == null или если r.RegistrationCountry == null. Код должен проверить эти возможности. «Самый защищенный» код должен проверять каждую ссылку примерно так:
r != null && r.RegistrationCountry != null && r.RegistrationCountry.IsUSAOrCandada() &&
, который гарантирует, что каждый шаг будет выполнен только в случае успешного выполнения предыдущего шага. Обратите внимание, что в списке может никогда не быть r == null, поэтому проверка может не потребоваться. Или r.RegistrationCountry может быть структурой (необнуляемый тип), так что вы будете знать, что проверка не требуется. Таким образом, вы можете избежать ненужных проверок, думая об этом. Но вам нужно продумать каждую часть кода, чтобы оспорить и устранить все предположения.