Не могу найти, почему у меня есть исключение нулевой ссылки


Ниже приведен код и проблемная строка.

Когда я навожу курсор мыши на src.EnergyServiceLevel, он показывает, что он равен нулю. Как это может быть, если я проверяю null в предыдущей строке?

Я предположил, что, возможно, есть потоки, которые создают проблему, поэтому я добавил блокировку, но это не помогло.

public static ServiceLevelsGroup SafeClone(this ServiceLevelsGroup src) {
  ServiceLevelsGroup res = null;
  lock (_locker) {
    if (src != null) {
      res = new ServiceLevelsGroup();
      if (src.EnergyServiceLevel != null) {
        res.EnergyServiceLevel = new ServiceLevelInfo { ServiceGrade = src.EnergyServiceLevel.ServiceGrade };

        if (src.EnergyServiceLevel.Reason != null)
          res.EnergyServiceLevel.Reason = src.EnergyServiceLevel.Reason;
      }
    }
  }

  return res;
}

Исключение возникает в строке res.EnergyServiceLevel = ... в приведенном выше коде.

Вот скриншот исключения, возникающего в режиме отладки:

Скриншот исключения во время отладки

3 4

3 ответа:

Ваш код показывает lock(_locker) - таким образом, вы находитесь в многопоточной среде. Можете ли вы проверить, что ничто другое не обнуляет вашу переменную? то есть, что все остальное также вызывает lock(_locker) правильно?

Может быть, ваш нуль равен res.EnergyServiceLevel.

src.EnergyServiceLevel.ServiceGrade может быть null

Перемещение указателя мыши к каждой ссылке точно покажет вам, что является нулем.