c# - 为什么 Unity3d C# 中的 if 语句允许不是 bool 值的对象?

标签 c# unity3d

在标准 .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/

相关文章:

c# - Unity内存问题资源图片

c# - LINQ:跳过并获取重复项

c# - 将 C# GRPC 客户端连接到 Go Server

optimization - 20 MB - 这是我们使用 Unity 制作的益智游戏的最小包大小吗?

c# - 让 C# 和 Python 为这个机器学习任务进行通信的最佳方法是什么?

c# - 如何在 C# (Unity) 中引用 "SpaceBar" key ?

c# - 尝试将 protobuf-net 与预分配对象一起使用

c# - Web API 2.0 异常处理

c# - 用于注册设备并接收通知的 Azure 通知中心示例

c# - 将 pdf 文件发送到打印机 - 打印 pdf