jeromej
jeromej

Reputation: 11626

UnassignedReferenceException even though using the null-conditional operator

I'm getting a UnassignedReferenceException: The variable _Preset of Foo has not been assigned. even though I'm using the null-conditional operator ?..

My code:

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

I'm also noticing that it mentions _Preset instead of Preset (which I find odd).

Code in Foo.cs :

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

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

What am I doing wrong? Isn't it what the operator is for?

Google searches didn't help.

Upvotes: 4

Views: 1707

Answers (2)

jeromej
jeromej

Reputation: 11626

As a late update and if you have the possibility to, you should definitely use the ReSharper Extension for Unity.

Among other neat features, whenever it can, ReShaper for Unity will warn you if you are trying to use an operator you shouldn't on an Unity object.

Upvotes: 0

Hellium
Hellium

Reputation: 7356

Unity has a custom way to check inspector's references against null.

When a MonoBehaviour has fields, in the editor only[1], we do not set those fields to “real null”, but to a “fake null” object. Our custom == operator is able to check if something is one of these fake null objects, and behaves accordingly

They may not have overloaded the null-conditional operator. Your get property returns the "fake null" explaining your unassigned error (and not the NullReferenceException).

The custom null check also comes with a bunch of downsides. It behaves inconsistently with the ?? operator, which also does a null check, but that one does a pure c# null check, and cannot be bypassed to call our custom null check.

I guess the same problem occurs for the null-conditional operator.

Upvotes: 6

Related Questions