问题
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.
回答1:
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.
来源:https://stackoverflow.com/questions/50103201/unassignedreferenceexception-even-though-using-the-null-conditional-operator