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

171
19 марта 2018, 22:31

Правильно ли я понимаю, что следующие конструкции должны быть эквивалентны:

 MeshCollider collider = go.GetComponent<MeshCollider>();
 MeshCollider meshCollider = collider != null ? collider : go.AddComponent<MeshCollider>();

и

 MeshCollider collider = go.GetComponent<MeshCollider>();
 MeshCollider meshCollider = collider ?? go.AddComponent<MeshCollider>();

Если да, то почему первая конструкция работает, а во второй я получаю null?

EDIT: Давайте так:

MeshCollider collider = go.GetComponent<MeshCollider>();
//Выводит True, логично поскольку MeshCollider ещё не установлен
Debug.Log(collider == null);
//Выводит False, логично поскольку MeshCollider ещё не установлен
Debug.Log(collider != null);

MeshCollider newCollider = go.AddComponent<MeshCollider>();
//Выводит 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);
Answer 1

Как и предполагал @АртёмОконечников в комментариях - проблема в перегрузке операторов == и !=.

Конструкция ?? сравнивает экземпляр левого операнда с null.

Но разработчики Unity решили переопределить UnityEngine.Object.operator == так, чтобы 'неинициализированный' экземпляр (который !destroyed) UnityEngine.Object и всех его потомков возвращал true при сравнении с null.

Например:

MeshCollider collider = new MeshCollider();
print(collider == null); //Выведет True

Таким образом конструкция ?? работает не так как ожидается, если операторы сравнения перегружены

READ ALSO
Ошибка: Uncaught SyntaxError: missing ) after argument list [требует правки]

Ошибка: Uncaught SyntaxError: missing ) after argument list [требует правки]

Не пойму, почему выбивает ошибку? Скобки все на месте

232
Настройка роутинга React приложения на WordPress

Настройка роутинга React приложения на WordPress

Привет!Я настроил роутинг сайта на Reactjs и без WordPress все работало,но как я закинул на WordPress то он не понимает откуда ему взять файлы

221
Яндекс карты, масштаб

Яндекс карты, масштаб

Доброго времениСуть проблемы в следующем

201