【发布时间】:2021-12-09 14:46:32
【问题描述】:
在标准 .NET 4.6 编译器中,以下 if 语句不合法,您将得到编译器错误:CS0029 无法将类型 'UserQuery.TestClass' 隐式转换为 'bool'。这一切都很好,我理解这一点。
void Main()
{
TestClass foo = new TestClass();
if(foo)
{
"Huh. Who knew?".Dump();
}
}
public class TestClass : Object
{
}
然而,在 Unity3d 中,这段代码是完全合法的,我见过几个例子,甚至鼓励这种 Javascript 风格的 null 检查。
这里发生了什么,是否可以在我在 .NET 中的非 Unity3d 工作中利用这一点?
这里是 Unity3D 中的合法代码示例:
using UnityEngine;
public class SampleIfBehavior : MonoBehaviour
{
// Use this for initialization
void Start ()
{
var obj = new SampleIfBehavior();
if (obj)
{
Console.Write("It wasn't null.");
}
}
}
剧情变厚了!如果我尝试比较一个不是从单声道行为派生的对象,我会收到预期的编译器警告。
public class TestClass
{
}
void Start ()
{
var obj2 = new TestClass();
if (obj2) // cast from TestClass to bool compiler error
{
}
}
感谢 Programmer,我一直挖掘到 Unity3D 的 Object(我忽略了它,因为我错误地认为它是 .NET 的实际对象。)
好奇的相关代码(在UnityEngine.Object中):
public static implicit operator bool(Object exists)
{
return !Object.CompareBaseObjects(exists, (Object) null);
}
public static bool operator ==(Object x, Object y)
{
return Object.CompareBaseObjects(x, y);
}
public static bool operator !=(Object x, Object y)
{
return !Object.CompareBaseObjects(x, y);
}
【问题讨论】:
-
@GrantWinney 添加了可工作的 unity3d 代码。
-
谈到您编辑的问题,大多数人认为 Unity 使用 .NET 对象。它使用
UnityEngine.Object,如果你不注意,这可能会混淆。