但是,对于某些其他语言而言,刚才这样的语句却是可行的。由于I是整数类型,有的语言会自动转换字符串”1234”为1234并赋予I。这种语言事实上还是强类型语言,只是做了强制类型转换,这【类似】于语言中的另外一个概念,叫算符重载,也就是说,可以根据类型信息决定运行的行为(算符重载在本质上和这个是一样的,但是从很多“专业”的意义上,两者是不同概念,实质上,一个是编译器语言内核做的算符重载,另外一个则是语言应用层面上的重载,实质是相同的)。拥有这种特性的语言有点意思,写起代码来很优雅,尤其是很多计算机编程的初学者都喜欢这种特性,但是对于一个开发经验丰富的人而言,这种特性带来的坏处往往超过了其带来的便利性,我们来看一个TSL语言的例子:
A:="1234";
B:=1;
C:=B+StrToInt(A); //StrToInt是一个把字符串转换成为整数的函数,我们先不去理解TSL的函数的表达方式,函数会在后续章节中讲解
在TSL中,我们很明确地先把字符串A用相关函数转换成为整数再和B相加,这样我们很清楚C的结果是1+1234=1235。
假定是支持数据自动转换的语言,这样写就可以了:
A:="1234";
B:=1;
C:=B+ A;
编译器会自动识别B为整数,整数和后边的类型相加,自动把后边的数据类型转换成为整数,这样我们可以称之为语言内核已经重载了+运算符,使得自动执行了将第二操作数自动转换成为和第一个操作数相同的类型,也就是自动把字符串”1234”自动转换成为和整数1一样的类型的功能。
以上代码看起来显然比没有自动类型转换的看起来要简单和优雅,但是我们再看下一个代码:
A:="1234";
B:=1;
C:= A+B;
这个C的结果会是什么呢?由于A是字符串,所以先要把B的结果1先变成字符串"1"再和A相加,结果就变成了"12341"。
这样就出现了很意想不到的效果了:A+B的结果与B+A的结果是完全不相同的,假定开发人员写的时候稍有不注意,这类的错误是非常容易犯下并难以查找的。
正因为数据类型的自动转换和算符重载功能是一把双刃剑,因此TSL语言并不支持数据类型的自动转换和算符重载。所有算符重载的功能都可以使用不重载的方法来实现,仅仅只是代码看起来繁杂一点,但是其意义的明确带来的好处完全可以抵消代码繁杂的坏处。
2016年下半年的Object TSL已经支持对象的算符重载,以支持TSL的对象利用标准算符进行计算。