#c_sharp #unity3d
Правильно ли я понимаю, что следующие конструкции должны быть эквивалентны: MeshCollider collider = go.GetComponent(); MeshCollider meshCollider = collider != null ? collider : go.AddComponent (); и MeshCollider collider = go.GetComponent (); MeshCollider meshCollider = collider ?? go.AddComponent (); Если да, то почему первая конструкция работает, а во второй я получаю null? EDIT: Давайте так: MeshCollider collider = go.GetComponent (); //Выводит True, логично поскольку MeshCollider ещё не установлен Debug.Log(collider == null); //Выводит False, логично поскольку MeshCollider ещё не установлен Debug.Log(collider != null); MeshCollider newCollider = go.AddComponent (); //Выводит False, логично поскольку MeshCollider теперь установлен Debug.Log(newCollider == null); //Выводит True, логично поскольку MeshCollider теперь установлен Debug.Log(newCollider != null); 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);
Ответы
Ответ 1
Как и предполагал @АртёмОконечников в комментариях - проблема в перегрузке операторов == и !=. Конструкция ?? сравнивает экземпляр левого операнда с null. Но разработчики Unity решили переопределить UnityEngine.Object.operator == так, чтобы 'неинициализированный' экземпляр (который !destroyed) UnityEngine.Object и всех его потомков возвращал true при сравнении с null. Например: MeshCollider collider = new MeshCollider(); print(collider == null); //Выведет True Таким образом конструкция ?? работает не так как ожидается, если операторы сравнения перегружены
Комментариев нет:
Отправить комментарий