嘛,还是分析一下数学函数的执行过程吧:
首先传入参数;
然后将参数代入一个表达式中(具体形式不确定),计算表达式并赋值给函数名(相当于一个普通变量);
最后通过函数名返回计算结果。
(怎么看起来像“把大象装冰箱总共分三步”

但是这样一个简化的过程也能说明问题了)
可以看到,其中的关键步骤就是表达式的计算。
由于不知道数学函数的具体表达式,我们可以构造一个自己的函数:

Function Plus1(Number)
Plus1 = Number + 1
End Function
通过这个函数,就可以解释Variant类型的“进出一致”现象了,在此不展开分析。
需要解释的是String、Boolean和Date这几种类型。
String和Boolean这两种,如我已经说过的,需要进行强制转换才能进行数值运算,而转换之后的类型自然和参数原本的类型就不一致了,因此表达式结果的类型以及函数值的类型就和参数类型不同了。而我们可以看到,这个函数中并没有将函数值的类型再转换回参数类型的过程,因此这个不同就保留下来了。
而Date类型,也是我们讨论的重点,它根本【就是】一个数值类型!注意我的说法,既不是“需要跟数值类型相互转换”,也不是“用数值表示的非数值类型”,而是“就是数值类型”!Date类型在内存中的存储格式就是Double类型的数据!给你看两句出自MSDN的原话:
Date 变量存储为 IEEE 64 位(8 个字节)浮点数值形式……
Double(双精度浮点型)变量存储为 IEEE 64 位(8 个字节)浮点数值的形式……
看见没有?这俩类型完全就是一回事!只是给人看的时候VB把它们处理成了不同的样子而已。
但这种“无差别对待”无形中也成了数学函数的bug:进去的是日期型,出来的还是日期型……
但是!谁在使用数学函数的时候会无聊到去触发这种bug啊,正常人都不会用日期型数值作为参数的吧
