Страницы

Поиск по вопросам

среда, 17 апреля 2019 г.

Проблемы с Null-коалесцентным оператором

Правильно ли я понимаю, что следующие конструкции должны быть эквивалентны:
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);


Ответ

Как и предполагал @АртёмОконечников в комментариях - проблема в перегрузке операторов == и !=
Конструкция ?? сравнивает экземпляр левого операнда с null
Но разработчики Unity решили переопределить UnityEngine.Object.operator == так, чтобы 'неинициализированный' экземпляр (который !destroyed) UnityEngine.Object и всех его потомков возвращал true при сравнении с null
Например:
MeshCollider collider = new MeshCollider(); print(collider == null); //Выведет True
Таким образом конструкция ?? работает не так как ожидается, если операторы сравнения перегружены

Комментариев нет:

Отправить комментарий