As mentioned in the documentation, automatic conversion only happens between numbers and strings, not with Lists and Dictionaries. This is to avoid mistakes, e.g., trying to concatenate a List and a String.
Something like let l = [1,2,3] exec "Foo ". l could come handy though -- which isn't possible now.
Looking back, now that Vim script has become much more complex, a bit more type checking would be good.
A valid point. Mabye this could be done by an assert command/function that checks its arguments or does nothing depending on an option (maybe 'debug')/flag/variable?