代码改变世界

IronPython的第三块鳞片(补充)

2004-09-23 16:47  FantasySoft  阅读(1128)  评论(2编辑  收藏

         在9月份的Mail List中还有一个message也是很有价值的。在Interactive的方式下,键入如下两行代码:

>>>from System.Console import *
>>>WriteLine("Hello,world!")

屏幕上并不会出现我们所期待的Hello,world! 倒是出现了一个True。如果将第二行改为WriteLine("{0}","Hello,World!"),我们就能够看到我们期待的Hello,world!了,这是怎么回事呢?
        因为IronPython在调用CLR中方法的时候,都是使用了反射的机制。当一个方法被重载(overload)了,也就是说有多个同名函数对应类型不同或者个数不同参数的时候,这些函数都会存放在一个list中。IronPython并没有去搜索最适合的方法,只是简单地检查了参数的个数是否匹配,那么结果就可想而知了:参数个数为1的WriteLine函数有很多,而WriteLine(bool)在整个list中排在了最前面,而且在Python的语法当中,string类型是可以隐式转换为bool类型的,因此WriteLine(bool)就被调用了。而对应参数个数为2的WriteLine方法就只有一个WriteLine(String,Object),那么在Interactive方式下WriteLine("{0}","Hello,World!")是可以被正确调用的。