>
>
>
V3211. Unity Engine. The operators '?.'…


V3211. Unity Engine. The operators '?.', '??' and '??=' do not correctly handle destroyed objects derived from 'UnityEngine.Object'.

Анализатор обнаружил потенциальную ошибку, связанную с тем, что объект производный от UnityEngine.Object был использован с оператором условного null (?.) или null-объединения (?? и ??= ).

Согласно документации Unity, не рекомендуется использовать операторы ?., ?? и ??=. Поскольку их нельзя перегрузить, они не учитывают возможность уничтожения объектов, производных от UnityEngine.Object. Вследствие чего, проверка может иметь некорректный результат.

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

class CustomComponent: MonoBehaviour
{
  public bool HitConfirm(....)
  {  
    Projectile bullet;
    ....
    if(....)
      Destroy(bullet);
    ....
    if(bullet?.isJammed())
    {....}
  }
}

В данном случае при обращении к bullet проверка с помощью оператора условного null (?. ) не будет учитывать возможность, что объект может быть уничтожен, так как этот оператор нельзя перегрузить.

Чтобы это исправить, рекомендуется использовать проверку с помощью оператора == или !=.

Исправленный вариант:

class CustomComponent: MonoBehaviour
{
  public bool HitConfirm(....)
  {  
    Projectile bullet;
    ....
    if(....)
      Destroy(bullet);
    ....
    if(bullet != null ? bullet.isJammed() : null)
    {....}
  }
}