3

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; }
    }
}

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

谷歌搜索没有帮助。

4

2 回答 2

6

Unity 有一种自定义方法来检查检查器的引用是否为空。

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

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

自定义空值检查也有很多缺点。它的行为与 ?? 不一致 运算符,它也进行空值检查,但它只进行纯 c# 空值检查,并且不能绕过调用我们的自定义空值检查。

我想空条件运算符也会出现同样的问题。

于 2018-04-30T15:16:51.593 回答
0

作为较晚的更新,如果您有可能,您绝对应该使用ReSharper Extension for Unity

在其他简洁的功能中,如果您尝试在 Unity 对象上使用不应该使用的运算符, ReShaper for Unity会在可能的情况下向您发出警告。

于 2020-03-26T17:05:36.583 回答