【问题标题】:UnassignedReferenceException even though using the null-conditional operatorUnassignedReferenceException 即使使用空条件运算符
【发布时间】:2018-04-30 15:02:07
【问题描述】:

即使我使用的是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; }
    }
}

我做错了什么?运营商不就是为了这个吗?

Google 搜索没有帮助。

【问题讨论】:

  • UnassignedReferenceException 与 NullReferenceException 不同。
  • 看起来像是 Unity 特有的东西,如果你搜索 UnassignedReferenceException 似乎是一些简单的答案
  • 如果去掉空条件运算符,像myTarget.Preset.ApplyTo(myTarget);一样直接使用,会发生什么?有什么错误吗?
  • @Programmer 无论有没有它都会出现相同的错误。 (仅当我没有在 Inspector 中指定值时,如预期的那样)
  • 我认为即使从编辑器初始化时问题仍然存在。我建议你只使用== nll 或!= null。如果可行,请坚持下去。

标签: c# unity3d null-conditional-operator


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    在其他简洁的功能中,ReShaper for Unity 会在您尝试对 Unity 对象使用不应该使用的运算符时发出警告。

    【讨论】:

      猜你喜欢
      • 2017-08-25
      • 2015-06-13
      • 2017-10-01
      • 1970-01-01
      • 2016-06-23
      相关资源
      最近更新 更多