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)
{....}
}
}