﻿# V3216\. Unity Engine\. Checking a field with a specific Unity Engine type for null may not work correctly due to implicit field initialization by the engine\.

Анализатор обнаружил ненадежную проверку на null поля, которое может быть инициализировано в инспекторе Unity\. Ненадежной она является, потому что выполняется с помощью оператора, не имеющего перегрузку для учета специфики кода Unity\-скриптов\. В частности, Unity неявно инициализирует отображаемые в инспекторе поля базовым значением если их тип — UnityEngine\.Object или производный от него \(исключение – MonoBehaviour и ScriptableObject классы\)\. Этот объект является эквивалентом null, однако операторы ?\., ??, ??\= и is не знают об этом и воспринимают его как обычное значение\.

Рассмотрим пример:

```cpp
public class ActivateTrigger: MonoBehaviour
{
  [SerializeField]
  GameObject _target;

  private void DoActivateTrigger()
  {
     var target = _target ?? gameObject;
    ....
  }
}
```

В данном случае, если значение `_target` еще не менялось в процессе выполнения, проверка `??` будет считать `_target` не равным `null`, независимо от того, было назначено значение поля в инспекторе Unity или нет\.

Решением проблемы является использование `==`, `!=` или сокращенных проверок \(`field`, `!field`\) для проверки на равенство/неравенство с `null`, которые учитывают специфичные для Unity\-скриптов моменты\.

Так, в данном случае исправленный код может выглядеть следующим образом:

```cpp
public class ActivateTrigger: MonoBehaviour
{
  [SerializeField]
  GameObject _target;

  private void DoActivateTrigger()
  {
    var target = _target;

    if (target == null)
      target = gameObject;
    ....
  }
}
```

Теперь вместо `??` используется проверка `target` на равенство `null` с помощью оператора `==`\. Данная операция имеет переопределение, учитывающее нюанс описанный в начале документации \(так же как `target != null`\), а потому проверка будет работать правильно в любом случае\.