Правильно ли я понимаю, что следующие конструкции должны быть эквивалентны:
MeshCollider collider = go.GetComponent
и
MeshCollider collider = go.GetComponent
Если да, то почему первая конструкция работает, а во второй я получаю null?
EDIT:
Давайте так:
MeshCollider collider = go.GetComponent
MeshCollider newCollider = go.AddComponent
MeshCollider meshCollider1 = collider != null ? collider : newCollider;
MeshCollider meshCollider2 = collider == null ? newCollider : collider;
MeshCollider meshCollider3 = collider ?? newCollider;
//Не логично
//Выводит Test (UnityEngine.MeshCollider), Test (UnityEngine.MeshCollider), null
Debug.LogFormat("{0}, {1}, {2}", meshCollider1, meshCollider2, meshCollider3);
Ответ
Как и предполагал @АртёмОконечников в комментариях - проблема в перегрузке операторов == и !=
Конструкция ?? сравнивает экземпляр левого операнда с null
Но разработчики Unity решили переопределить UnityEngine.Object.operator == так, чтобы 'неинициализированный' экземпляр (который !destroyed) UnityEngine.Object и всех его потомков возвращал true при сравнении с null
Например:
MeshCollider collider = new MeshCollider();
print(collider == null); //Выведет True
Таким образом конструкция ?? работает не так как ожидается, если операторы сравнения перегружены
Комментариев нет:
Отправить комментарий