Анализатор обнаружил ненадежную проверку на null
поля, которое может быть инициализировано в инспекторе Unity. Ненадежной она является, потому что выполняется с помощью оператора, не имеющего перегрузку для учета специфики кода Unity-скриптов. В частности, Unity неявно инициализирует отображаемые в инспекторе поля базовым значением если их тип — UnityEngine.Object
или производный от него (исключение – MonoBehaviour
и ScriptableObject
классы). Этот объект является эквивалентом null
, однако операторы ?.
, ??
, ??=
и is
не знают об этом и воспринимают его как обычное значение.
Рассмотрим пример:
public class ActivateTrigger: MonoBehaviour { [SerializeField] GameObject _target; private void DoActivateTrigger() { var target = _target ?? gameObject; .... } }
В данном случае, если значение _target
еще не менялось в процессе выполнения, проверка ??
будет считать _target
не равным null
, независимо от того, было назначено значение поля в инспекторе Unity или нет.
Решением проблемы является использование ==
, !=
или сокращенных проверок (field
, !field
) для проверки на равенство/неравенство с null
, которые учитывают специфичные для Unity-скриптов моменты.
Так, в данном случае исправленный код может выглядеть следующим образом:
public class ActivateTrigger: MonoBehaviour { [SerializeField] GameObject _target; private void DoActivateTrigger() { var target = _target; if (target == null) target = gameObject; .... } }
Теперь вместо ??
используется проверка target
на равенство null
с помощью оператора ==
. Данная операция имеет переопределение, учитывающее нюанс описанный в начале документации (так же как target != null
), а потому проверка будет работать правильно в любом случае.
Данная диагностика классифицируется как: