UnassignedReferenceException, даже если используется нулевой условный оператор

Я получаю UnassignedReferenceException: The variable _Preset of Foo has not been assigned. хотя я использую нуль-условный оператор ?.,

Мой код:

// […]
myTarget.Preset?.ApplyTo(myTarget);

Я также заметил, что это упоминает _Preset вместо Preset (что я нахожу странным).

Код в Foo.cs :

[CreateAssetMenu()]
public class Foo : ScriptableObject
{
    [SerializeField] private Preset _Preset = null;

    public Preset Preset
    {
        get { return _Preset; }
        protected set { _Preset = value; }
    }
}

Что я делаю неправильно? Разве это не то, для чего оператор?

Поиск в Google не помог.

1 ответ

Решение

В Unity есть собственный способ проверки ссылок инспектора на нуль.

Когда MonoBehaviour имеет поля, только в редакторе [1] мы устанавливаем для этих полей не "реальный ноль", а объект "поддельный ноль". Наш пользовательский оператор == может проверить, является ли что-то одним из этих поддельных нулевых объектов, и ведет себя соответственно

Возможно, они не перегружены нулевым условным оператором. Ваш get свойство возвращает "поддельный ноль", объясняющий вашу неназначенную ошибку (а не исключение NullReferenceException).

Настраиваемая проверка нуля также имеет ряд недостатков. Он ведет себя несовместимо с оператор, который также выполняет нулевую проверку, но тот, который выполняет чистую проверку C# null, и не может быть обойден для вызова нашей пользовательской проверки нулей.

Я предполагаю, что та же самая проблема возникает для нуль-условного оператора.

В качестве позднего обновления, и если у вас есть возможность, вам обязательно стоит использовать ReSharper Extension for Unity.

Среди других полезных функций, ReShaper for Unity всегда будет предупреждать вас, если вы пытаетесь использовать оператор, который не следует использовать для объекта Unity.

Другие вопросы по тегам