编辑:这篇文章解释了一切! - Unity在销毁UnityEngine.Objects时会创建托管的虚拟包装器。这意味着,如果你销毁一个UEObject,C#包装器仍可能不为null。==运算符以自定义方式实现,因此当你销毁UEObject时,检查== null将返回true。这显然与泛型不兼容。
这真的让我发疯了。我有这个方法在这里:
public static void AssertNotNullAfterAssignment<T>(ref T value, Func<T> get, string msg) where T : class
{
if (value == null)
value = get();
if (value == null)
throw new NullReferenceException(msg);
}
我在开始时调用了一个空引用:
AssertNotNullAfterAssignment(ref fovMeshFilter, GetComponent<MeshFilter>, "fovMeshFilter");
“真正疯狂的是,检查语句
if (value == null)
返回false!尽管value确实为null!”“这里是我制作的一个短视频,展示了这个问题。”
有趣的是,如果我将该方法代码复制/粘贴到我在其中使用它的方法中(在OnEnable中),它就可以工作(基本上与我在视频中在OnEnable中所述的相同)。
所以……如果它在断言方法之外,它就可以工作,但在内部则不行。 我还尝试过使用Equals而不是==,但结果相同。
任何人有任何想法吗?
编辑:这里是OnEnable,我从中调用断言的方法:
private void OnEnable()
{
//if (fovMeshFilter== null)
// fovMeshFilter= GetComponent<MeshFilter>();
//if (fovMeshFilter== null)
// throw new NullReferenceException("fovMeshFilter");
AssertNotNullAfterAssignment(ref fovMeshFilter, GetComponent<MeshFilter>, "fovMeshFilter");
}
如果我使用未注释的行,它会按预期工作,但是断言方法出于某种只有上帝知道的原因不起作用。
编辑1:我们在这里有什么?
编辑2:
编辑3:
在这个伟大的社区的帮助下,经过几次测试,我找到了解决方案。我发誓这是我尝试的第一件事情!你必须相信我!XD- 只需要使用.Equals
而不是==
- 就像@Edin在他的答案中所示,对通用对象进行==
似乎会调用System.Object
的==
- 但是,调用.Equals
应始终解析为Equals
的正确重载。我不知道为什么是这样,我的意思是,为什么“==”也不能解析为正确的重载呢?
ToString()
返回"null"
,则会写入"null"
。无论如何,您的对象不是null,这就是为什么您的检查返回false的原因。 - Edin