在标准 .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 风格的空值检查。
这是怎么回事,是否可以在我的 .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);
}
最佳答案
不要太担心这个。 if (obj)
仅在 Unity 中合法,因为 Unity 中存在隐式运算符重载。它在 UnityEngine.Object
类中完成。
看起来像这样:
public static implicit operator bool(Object obj)
{
return (obj != null);
}
Unity 计划删除此功能,但决定反对它,因为它会破坏那里的所有 Unity 代码。您可以阅读更多相关信息 here .
此功能非常糟糕的一面是它使得无法在编辑器中使用 Null-Coalescing 运算符功能。好的一面是它简化了对 null< 的检查
.
关于c# - 为什么 Unity3d C# 中的 if 语句允许不是 bool 值的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45557578/