Страницы

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

воскресенье, 9 февраля 2020 г.

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

#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 Таким образом конструкция ?? работает не так как ожидается, если операторы сравнения перегружены

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

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