提问人:Spring E. Thing 提问时间:7/22/2023 最后编辑:Spring E. Thing 更新时间:7/25/2023 访问量:105
Unity “null” == 检查失败?
Unity "null" == Check Failing?
问:
https://i.stack.imgur.com/jyYpi.gif所以我做 Unity C# 编程已经有大约 6 年了,我只是刚刚发现 C# 与 s.Unity(我猜这就是你学习 C# 的方式时得到的)。毋庸置疑,这项工作相当麻烦,因为多年来我一直在项目中使用运算符吨,由于 Unity 是用 C++ 编写的,而 C# 只是编写项目的层,因此根本无法与 Unity 一起使用,Unity AFAIK 的真正含义是被销毁,但引用仍然存在用于调试目的,只有在 GC 之后才会成为 C#。null
"null"
?.
"null"
"null"
UnityEngine.Object
null
我已经对 Unity 和 C# 之间的差异进行了一些研究,我对为什么我仍然遇到空检查问题感到非常困惑。
您可以在上面的GIF中看到,这显然是Unity而不是C#。我做了一个比较,从我被告知应该在这种情况下,因为 Unity 覆盖了所有实例的运算符并考虑了这一点,而不是不考虑类似 .但是,正如您在 GIF 中也可以看到的,存储此比较结果(用于调试目的)的是 ,这让我感到困惑,我明确使用了我被告知在这种情况下覆盖的运算符,但我得到了相同的结果,就好像我没有明确比较一样。"null"
null
inst
"null"
null
inst==null
true
==
UnityEngine.Object
?.
bool
==
false
==
UnityEngine.Object
请注意有关所提供的 GIF 的一些事项:
- GIF中的某些功能不必要地冗长,以帮助我调试此问题
TRefType
被收缩为 a ,所以它可以是 an 或 a,我需要一种方法来检查其中任何一个。where
class
object
UnityEngine.Object
null
这是怎么回事?!整个 C# 与光是 Unity 这件事就打乱了我的流程,现在我对这个问题的理解可能也不完全存在!
有关整个主题的更多信息,假设您像我发现 Unity 时一样迷茫,请查看以下内容: https://blog.unity.com/technology/custom-operator-should-we-keep-itnull
"null"
"null"
以下是我在写这篇文章之前检查的其他一些 StackOverflow 线程,它们只会进一步说服我我目前的理解是正确的,但我仍然没有得到我期望的结果: 为什么 C# null 条件运算符不适用于 Unity 可序列化变量? Unity : this == null 返回 true。怎么会这样呢?
这是我在项目的其余部分独立使用的函数,作为代码块,以方便您回复。您可以忽略其他结果,它们现在正在按预期运行:case
private bool IsNull(TRefType inst)
{
Type instType = null;
if(inst!=null)
instType = inst.GetType();
switch (instType)
{
case Type t when t == typeof(string):
return string.IsNullOrWhiteSpace(inst.ToString());
case Type t when t == typeof(IEnumerable):
if (t != typeof(IDictionary))
return CollectionHelpers.AnyAllScanners.AnyElementsNotNull(inst as IEnumerable);
else
return CollectionHelpers.AnyAllScanners.AnyElementsNotNull(inst as IDictionary);
default:
bool iN = inst==null;
bool iTN = instType == null;
return iN || iTN;
}
}
任何帮助,非常感谢!
答:
这似乎是某个泛型类的一部分,对于用作泛型类型参数的所有引用类型,泛型方法实现将被共享(即编译器将为作为泛型类型参数传递的所有引用类型生成一个方法,以防止代码膨胀),因此运算符解析发生在编译时,因此在这种情况下,这是“C# 的 null”。IsNull
您添加检查:UnityEngine.Object
switch (instType)
{
// ...
case _ when typeof(UnityEngine.Object).IsAssignableFrom(instType):
return (inst as UnityEngine.Object) == null;
// ...
}
评论
TRefType
where
class
TRefType
UnityEngine.Object
TRefType
((UnityEngine.Object)(object)inst)
(inst as UnityEngine.Object)
where
inst
UnityEngine.Object
inst
UnityEngine.GameObject
case
==
override
class
==
override
评论