zoukankan      html  css  js  c++  java
  • 警惕!Unity3D中UnityEngine.Object的一个小陷阱

    先看看如下C#的脚本代码:

    猜猜控制台打出来的是什么?

    In the bool parameter function, value info is:  True

    肯定出乎很多人的意料吧?大笑

    transform的类型跟bool类型一点关系都没有,怎么会调用TestFunction(bool value)呢?我碰到这个问题的时候,第一反应是编译器出问题了,后来同事的机器上一样有同样的运行结果。于是我继续写了如下代码:

    这次的运行结果符合预期了,调用的是void TestFunction(System.Object value):

    In the Object parameter function, value info is:  MyClass

    那么问题还是出现在Unity3D的类,也就是Transform上,那就挨个看它的父类,最上面就是UnityEngine.Object。接着看了下UnityEngine.Object的metaData文件,才恍然大悟:

    unity3d的Object类重载了类型隐式转换运算符bool(其他类型转换一样可以被重载,不仅仅是bool),所以TestFunction(transform) 实际上调用的是这个函数,这个重载函数的作用是判断当前Object是否非空,这也符合输出的信息(也就是true)。好吧,不小心踏入了这个陷阱,而且编辑器在编辑阶段也不会有任何警告。那如果想正常调用应该如何做呢?只用这样:

    TestFunction(transform as object); 

    因为System.object并没有重载类型转换运算符bool,输出如下(我把这个脚本挂在MainCamera下了):

    In the Object parameter function, value info is:  Main Camera (UnityEngine.Transform)

    事情暂且告一段落,不过个人感觉确实是一个陷阱骂人,诸位觉得如何呢?

  • 相关阅读:
    selenium 难定位元素、时间插件
    列表生成式
    三元表达式
    监控日志
    非空即真
    深拷贝浅拷贝
    元组
    list字典嵌套
    2021
    布尔类型
  • 原文地址:https://www.cnblogs.com/suway/p/7384412.html
Copyright © 2011-2022 走看看