UnassignedReferenceException,即使使用null-conditional运算符

时间:2018-04-30 15:02:07

标签: c# unity3d null-conditional-operator

即使我正在使用null-conditional operator 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; }
    }
}

我做错了什么?这不是运营商的目的吗?

谷歌搜索没有帮助。

2 个答案:

答案 0 :(得分:2)

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

  

当MonoBehaviour有字段时,仅在编辑器[1]中,我们不会将这些字段设置为“真正的空”,而是设置为“假空”对象。我们的自定义==运算符能够检查某些东西是否是这些假的空对象之一,并且相应地表现

他们可能没有重载空条件运算符。您的get属性返回“假null”,解释您的未分配错误(而不是NullReferenceException)。

  

自定义空检查还带有一些缺点。   它表现得与??不一致运算符,它也执行空检查,但是那个执行纯c#null检查,并且不能绕过调用我们的自定义空检查。

我猜这个空条件运算符会出现同样的问题。

答案 1 :(得分:0)

作为最新更新,如果可以的话,您绝对应该使用ReSharper Extension for Unity

在其他整洁的功能中,只要可能, ReShaper for Unity 都会警告您,如果您尝试使用不应该在Unity对象上使用的运算符。