即使我正在使用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; }
}
}
我做错了什么?这不是运营商的目的吗?
谷歌搜索没有帮助。
答案 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对象上使用的运算符。